OSDN Git Service

演奏ステージで動画を中央表示にすると譜面スクロールがガタガタになるミスを修正。
authorくまかみ工房 <kumakamikoubou@gmail.com>
Sun, 16 Apr 2017 05:41:52 +0000 (14:41 +0900)
committerくまかみ工房 <kumakamikoubou@gmail.com>
Sun, 16 Apr 2017 05:41:52 +0000 (14:41 +0900)
中央表示では背景動画を2枚表示するが、その際に2回デコードしようとするケースがあったため。
2枚目は前のフレームを再描画するようにした。

FDK/メディア/動画.cs
StrokeStyleT/ステージ/演奏/演奏ステージ.cs

index 85c37c2..2d9f65c 100644 (file)
@@ -112,7 +112,7 @@ namespace FDK.メディア
                                        // (C) 次のフレームの表示時刻にはまだ達していない。
                                        else
                                        {
-                                               _前のフレームを表示する();
+                                               this.前のフレームを描画する( dr, 変換行列, 不透明度0to1 );
                                        }
 
                                        #region " ローカル関数 "
@@ -124,10 +124,6 @@ namespace FDK.メディア
                                                this._最後に表示したフレーム = frame;
                                                this._D2DBitmapを描画する( dr, 変換行列, frame.D2DBitmap, 不透明度0to1 );
                                        };
-                                       void _前のフレームを表示する()
-                                       {
-                                               this._D2DBitmapを描画する( dr, 変換行列, this._最後に表示したフレーム?.D2DBitmap, 不透明度0to1 );
-                                       };
                                        //----------------
                                        #endregion
                                }
@@ -140,6 +136,25 @@ namespace FDK.メディア
                        }
                }
 
+               public void 前のフレームを描画する( デバイスリソース dr, RectangleF 描画先矩形dpx, float 不透明度0to1 = 1.0f )
+               {
+                       // Direct2D の行列は、設計単位じゃなく物理単位で計算するので注意。
+                       var 変換行列2Dpx =
+                               dr.拡大行列DPXtoPX // スケーリング(1) DPX → PX
+                               * Matrix3x2.Scaling( 描画先矩形dpx.Width / this.サイズdpx.Width, 描画先矩形dpx.Height / this.サイズdpx.Height )  // スケーリング(2)
+                               * Matrix3x2.Translation( 描画先矩形dpx.Left * dr.拡大率DPXtoPX横方向, 描画先矩形dpx.Top * dr.拡大率DPXtoPX縦方向 );  // 平行移動(物理単位)、
+
+                       this.前のフレームを描画する( dr, 変換行列2Dpx, 不透明度0to1 );
+               }
+
+               public void 前のフレームを描画する( デバイスリソース dr, Matrix3x2 変換行列, float 不透明度0to1 = 1.0f )
+               {
+                       lock( this._スレッド間同期 )
+                       {
+                               this._D2DBitmapを描画する( dr, 変換行列, this._最後に表示したフレーム?.D2DBitmap, 不透明度0to1 );
+                       }
+               }
+
                protected override void On活性化( デバイスリソース dr )
                {
                        this._デコードタスク = null;  // タスクが起動していないときは null であることを保証する。
index ace4323..b65da6c 100644 (file)
@@ -250,7 +250,8 @@ namespace SST.ステージ.演奏
                                                                                float 拡大縮小率 = 0.75f;
                                                                                float 上移動dpx = 100.0f;
 
-                                                                               this._背景動画?.進行描画する( dr, new RectangleF(
+                                                                               // 進行描画せず、直前に取得したフレームをそのまま描画する。
+                                                                               this._背景動画?.前のフレームを描画する( dr, new RectangleF(
                                                                                        w * ( 1f - 拡大縮小率 ) / 2f,
                                                                                        h * ( 1f - 拡大縮小率 ) / 2f - 上移動dpx,
                                                                                        w * 拡大縮小率,
@@ -976,7 +977,7 @@ namespace SST.ステージ.演奏
                                }
 
                                // ウェイト
-                               Thread.Sleep( 1 );
+                               Thread.Sleep( 4 );
                        }
 
                        this._高頻度進行タスクへのイベント.現在の状態 = TriStateEvent.状態種別.無効;