OSDN Git Service

#34198 動画再生開始直後にスクロールがガクッと来る問題を大幅に改善(ガクリ具合を削減した)。
authoryyagi <yyagi@16f42ceb-6dc6-49c8-ba94-f2d53467949d>
Wed, 25 Nov 2015 17:29:15 +0000 (17:29 +0000)
committeryyagi <yyagi@16f42ceb-6dc6-49c8-ba94-f2d53467949d>
Wed, 25 Nov 2015 17:29:15 +0000 (17:29 +0000)
最初に再生する動画を、演奏開始直後に再生&一時停止状態にしておきつつ、動画サイズに合わせたテクスチャを事前準備することで実現。
また、これに合わせて、動画のPAUSE/RESUMEのロジックを見直した。

git-svn-id: http://svn.osdn.jp/svnroot/dtxmania/trunk@883 16f42ceb-6dc6-49c8-ba94-f2d53467949d

DTXManiaプロジェクト/コード/スコア、曲/CDTX.cs
DTXManiaプロジェクト/コード/ステージ/07.演奏/CAct演奏AVI.cs
DTXManiaプロジェクト/コード/ステージ/07.演奏/CStage演奏画面共通.cs
DTXManiaプロジェクト/コード/ステージ/07.演奏/ギター画面/CStage演奏ギター画面.cs
DTXManiaプロジェクト/コード/ステージ/07.演奏/ドラム画面/CStage演奏ドラム画面.cs
FDK17プロジェクト/コード/04.グラフィック/CAviDS.cs
実行時フォルダ/DTXManiaGR.exe
実行時フォルダ/dll/FDK.dll

index 3ed4328..9c38643 100644 (file)
@@ -5635,17 +5635,43 @@ namespace DTXMania
                //-----------------\r
                #endregion\r
 \r
-               internal void tAVIの一時停止再生切り替え()\r
+               internal void t全AVIの一時停止()\r
                {\r
                        // AVI の一時停止\r
                        foreach (var avi in listAVI)\r
                        {\r
-                               avi.Value.avi.ToggleRun();\r
+                               if ( avi.Value.avi.b再生中 )\r
+                               {\r
+                                       avi.Value.avi.Pause();\r
+                               }\r
                        }\r
+               \r
                        // AVIPAN の一時停止\r
                        foreach (var avi in listAVIPAN)\r
                        {\r
-                               // avi.Value.avi.ToggleRun();\r
+                               //if ( avi.Value.avi.b再生中 )\r
+                               //{\r
+                               //      avi.Value.avi.ToggleRun();\r
+                               //}\r
+                       }\r
+               }\r
+               internal void t全AVIの再生再開()\r
+               {\r
+                       // AVI の再生再開\r
+                       foreach ( var avi in listAVI )\r
+                       {\r
+                               if ( avi.Value.avi.b一時停止中 )\r
+                               {\r
+                                       avi.Value.avi.ToggleRun();\r
+                               }\r
+                       }\r
+                       // AVIPAN の再生再開\r
+                       foreach ( var avi in listAVIPAN )\r
+                       {\r
+                               //if ( avi.Value.avi.b一時停止中 )\r
+                               //{\r
+                               //      avi.Value.avi.ToggleRun();\r
+                               //}\r
                        }\r
                }\r
        }\r
index 9d6d01c..3d5575f 100644 (file)
@@ -39,19 +39,23 @@ namespace DTXMania
                        set;\r
                }\r
 \r
-               private void CreateTexture(int width, int height)\r
+               public void PrepareProperSizeTexture(int width, int height)\r
                {\r
                        try\r
                        {\r
-                               if (this.tx描画用 != null)\r
+                               if ( this.tx描画用 != null && ( this.tx描画用.szテクスチャサイズ.Width != width || this.tx描画用.szテクスチャサイズ.Height != height ) )\r
                                {\r
+//Debug.WriteLine( "orgW=" + this.tx描画用.szテクスチャサイズ.Width + ", W=" + width + ", orgH=" + this.tx描画用.szテクスチャサイズ.Height + ", H=" + height );\r
                                        this.tx描画用.Dispose();\r
                                        this.tx描画用 = null;\r
                                }\r
-                               this.tx描画用 = new CTexture(\r
-                                       CDTXMania.app.Device, width, height,\r
-                                       CDTXMania.app.GraphicsDeviceManager.CurrentSettings.BackBufferFormat,\r
-                                       Pool.Managed);\r
+                               if ( this.tx描画用 == null )\r
+                               {\r
+                                       this.tx描画用 = new CTexture(\r
+                                               CDTXMania.app.Device, width, height,\r
+                                               CDTXMania.app.GraphicsDeviceManager.CurrentSettings.BackBufferFormat,\r
+                                               Pool.Managed);\r
+                               }\r
                        }\r
                        catch (CTextureCreateFailedException e)\r
                        {\r
@@ -79,9 +83,10 @@ namespace DTXMania
                                this.n表示側終了位置X = n表示側終了位置X * 2;\r
                                this.n表示側終了位置Y = n表示側終了位置Y * 2;\r
                                this.n総移動時間ms = n総移動時間ms;\r
+                               this.PrepareProperSizeTexture((int)this.rAVI.avi.nフレーム幅, (int)this.rAVI.avi.nフレーム高さ);\r
                                this.n移動開始時刻ms = ( n移動開始時刻ms != -1 ) ? n移動開始時刻ms : CSound管理.rc演奏用タイマ.n現在時刻;\r
-                               this.CreateTexture((int)this.rAVI.avi.nフレーム幅, (int)this.rAVI.avi.nフレーム高さ);\r
-                               this.rAVI.avi.Run();\r
+                               //this.rAVI.avi.Run();\r
+                               this.rAVI.avi.ToggleRun();\r
                        }\r
                }\r
                public void SkipStart( int n移動開始時刻ms )\r
@@ -348,7 +353,7 @@ namespace DTXMania
                                        355,\r
                                        CDTXMania.app.GraphicsDeviceManager.CurrentSettings.BackBufferFormat, Pool.Default, Usage.Dynamic );\r
 #else\r
-                               this.CreateTexture(\r
+                               this.PrepareProperSizeTexture(\r
                                                (bIsPreviewMovie) ? 204 : SampleFramework.GameWindowSize.Width,\r
                                                (bIsPreviewMovie) ? 269 : SampleFramework.GameWindowSize.Height\r
                                                );\r
index 4776f51..0c0da72 100644 (file)
@@ -732,6 +732,28 @@ namespace DTXMania
                        }\r
                }\r
 \r
+               /// <summary>\r
+               /// 演奏開始前に適切なサイズのAVIテクスチャを作成しておくことで、AVI再生開始時のもたつきをなくす\r
+               /// </summary>\r
+               protected void PrepareAVITexture()\r
+               {\r
+                       if ( CDTXMania.ConfigIni.bAVI有効 )\r
+                       {\r
+                               foreach ( CDTX.CChip pChip in listChip )\r
+                               {\r
+                                       if ( pChip.nチャンネル番号 == (int) Ech定義.Movie || pChip.nチャンネル番号 == (int) Ech定義.MovieFull )\r
+                                       {\r
+                                               // 最初に再生するAVIチップに合わせて、テクスチャを準備しておく\r
+                                               if (pChip.rAVI != null )\r
+                                               {\r
+                                                       this.actAVI.PrepareProperSizeTexture( (int) pChip.rAVI.avi.nフレーム幅, (int) pChip.rAVI.avi.nフレーム高さ );\r
+                                               }\r
+                                               break;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+\r
                protected E判定 e指定時刻からChipのJUDGEを返す( long nTime, CDTX.CChip pChip, int nInputAdjustTime, bool saveLag = true )\r
                {\r
                        if ( pChip != null )\r
@@ -1623,14 +1645,14 @@ namespace DTXMania
                     CSound管理.rc演奏用タイマ.t一時停止();\r
                                        CDTXMania.Timer.t一時停止();\r
                                        CDTXMania.DTX.t全チップの再生一時停止();\r
-                                       CDTXMania.DTX.tAVIの一時停止再生切り替え();\r
+                                       CDTXMania.DTX.t全AVIの一時停止();\r
                                }\r
                                else\r
                                {\r
                     CSound管理.rc演奏用タイマ.t再開();\r
                                        CDTXMania.Timer.t再開();\r
                                        CDTXMania.DTX.t全チップの再生再開();\r
-                                       CDTXMania.DTX.tAVIの一時停止再生切り替え();\r
+                                       CDTXMania.DTX.t全AVIの再生再開();\r
                                }\r
                        }\r
                        if ( ( !this.bPAUSE && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )\r
index cf45c3a..fb9172a 100644 (file)
@@ -102,7 +102,9 @@ namespace DTXMania
 \r
                                if( base.b初めての進行描画 )\r
                                {\r
-                    CSound管理.rc演奏用タイマ.tリセット();\r
+                                       this.PrepareAVITexture();\r
+\r
+                                       CSound管理.rc演奏用タイマ.tリセット();\r
                                        CDTXMania.Timer.tリセット();\r
                                        this.ctチップ模様アニメ.Guitar = new CCounter( 0, 0x17, 20, CDTXMania.Timer );\r
                                        this.ctチップ模様アニメ.Bass = new CCounter( 0, 0x17, 20, CDTXMania.Timer );\r
index e1731b8..94f85f2 100644 (file)
@@ -153,7 +153,9 @@ namespace DTXMania
                                #region [ 初めての進行描画 ]\r
                                if ( base.b初めての進行描画 )\r
                                {\r
-                    CSound管理.rc演奏用タイマ.tリセット();\r
+                                       this.PrepareAVITexture();\r
+\r
+                                       CSound管理.rc演奏用タイマ.tリセット();\r
                                        CDTXMania.Timer.tリセット();\r
                                        this.ctチップ模様アニメ.Drums = new CCounter( 0, 0x30, 10, CDTXMania.Timer );\r
                                        this.ctチップ模様アニメ.Guitar = new CCounter( 0, 0x17, 20, CDTXMania.Timer );\r
index fc14be8..bcbce7e 100644 (file)
@@ -29,10 +29,26 @@ namespace FDK
                                return (uint)nWidth;\r
                        }\r
                }\r
+               public bool b再生中\r
+               {\r
+                       get\r
+                       {\r
+                               return bPlaying;\r
+                       }\r
+               }\r
+               public bool b一時停止中\r
+               {\r
+                       get\r
+                       {\r
+                               return bPause;\r
+                       }\r
+               }\r
 \r
                int nWidth;\r
                int nHeight;\r
                long nMediaLength; // [ms]\r
+               bool bPlaying;\r
+               bool bPause;\r
 \r
                public int GetDuration()\r
                {\r
@@ -118,6 +134,11 @@ namespace FDK
                        #endregion\r
 \r
                        grabber.SetBufferSamples(true);\r
+                       this.Run();\r
+                       this.Pause();\r
+\r
+                       bPlaying = false;\r
+                       bPause = false;         // 外見えには演奏停止している。PAUSE中として外に見せないこと。\r
                }\r
 \r
                public void Seek(int timeInMs)\r
@@ -134,6 +155,8 @@ namespace FDK
                        DsError.ThrowExceptionForHR(hr);\r
                        hr = control.GetState(timeOutMs, out state);\r
                        DsError.ThrowExceptionForHR(hr);\r
+                       bPlaying = true;\r
+                       bPause = false;\r
                }\r
 \r
                public void Stop()\r
@@ -142,6 +165,8 @@ namespace FDK
                        DsError.ThrowExceptionForHR(hr);\r
                        hr = control.GetState(timeOutMs, out state);\r
                        DsError.ThrowExceptionForHR(hr);\r
+                       bPlaying = false;\r
+                       bPause = false;\r
                }\r
 \r
                public void Pause()\r
@@ -150,6 +175,7 @@ namespace FDK
                        DsError.ThrowExceptionForHR(hr);\r
                        hr = control.GetState(timeOutMs, out state);\r
                        DsError.ThrowExceptionForHR(hr);\r
+                       bPause = true;\r
                }\r
 \r
                public void ToggleRun()\r
index 3de6610..519716e 100644 (file)
Binary files a/実行時フォルダ/DTXManiaGR.exe and b/実行時フォルダ/DTXManiaGR.exe differ
index 0849835..d0eebf8 100644 (file)
Binary files a/実行時フォルダ/dll/FDK.dll and b/実行時フォルダ/dll/FDK.dll differ