OSDN Git Service

描画開始チップの移動処理を、高頻度進行処理スレッドから進行描画スレッドに移譲。
authorくまかみ工房 <kumakamikoubou@gmail.com>
Mon, 24 Oct 2016 07:11:45 +0000 (16:11 +0900)
committerくまかみ工房 <kumakamikoubou@gmail.com>
Mon, 24 Oct 2016 07:31:45 +0000 (16:31 +0900)
なるべく高頻度進行処理スレッドの処理を少なくするため。
この処理は低頻度でも問題ない。

StrokeStyleT/ステージ/演奏/スクロール譜面.cs

index 3a64389..05aaa7b 100644 (file)
@@ -119,6 +119,20 @@ namespace SST.ステージ.演奏
                                        if( y < -40.0 )   // y が画面上端より上に出ていればそこでチップのループ描画は終了。-40dpx はチップが隠れるであろう適当なマージン。
                                                break;
 
+                                       #region " チップが描画開始チップであり、かつ、そのY座標が画面下端を超えたなら、描画開始チップ番号を更新する。"
+                                       //----------------
+                                       if( ( this.描画開始チップ番号 == i ) && ( this.画面の高さdpx + 40.0 < y ) )   // +40 dpx はチップが(以下同上
+                                       {
+                                               this.描画開始チップ番号++;
+                                               if( 演奏スコア.チップリスト.Count <= this.描画開始チップ番号 )
+                                               {
+                                                       this.ステージクリア();
+                                                       this.描画開始チップ番号 = -1;    // 演奏終了。
+                                               }
+                                       }
+                                       //----------------
+                                       #endregion
+
                                        // チップを1つ描画する。
                                        if( チップ.可視 )
                                                描画アクション( dr, チップ, (float) y );
@@ -126,7 +140,6 @@ namespace SST.ステージ.演奏
                        }
                }
 
-
                /// <summary>
                /// 音声の再生と演奏用入力は、描画処理とは並行して、高頻度に行う。
                /// </summary>
@@ -159,56 +172,8 @@ namespace SST.ステージ.演奏
                                                        if( y < -40.0 )   // y が画面上端より上に出ていればそこでチップのループ描画は終了。-40dpx はチップが隠れるであろう適当なマージン。
                                                                break;
 
-                                                       #region " チップが描画開始チップであり、かつ、そのY座標が画面下端を超えたなら、描画開始チップ番号を更新する。"
-                                                       //----------------
-                                                       if( ( this.描画開始チップ番号 == i ) && ( this.画面の高さdpx + 40.0 < y ) )   // +40 dpx はチップが(以下同上
-                                                       {
-                                                               this.描画開始チップ番号++;
-                                                               if( 演奏スコア.チップリスト.Count <= this.描画開始チップ番号 )
-                                                               {
-                                                                       this.ステージクリア();
-                                                                       this.描画開始チップ番号 = -1;    // 演奏終了。
-                                                               }
-                                                       }
-                                                       //----------------
-                                                       #endregion
-                                                       #region " AutoPlay チップなら、自動ヒット判定を行う。"
-                                                       //----------------
-                                                       if( ( チップ.ヒットされていない ) &&    // チップが未ヒット、かつ、
-                                                               ( StrokeStyleT.ユーザ管理.現在選択されているユーザ.チップが自動演奏である( チップ.チップ種別 ) ) &&    // チップの AutoPlay が ON、かつ、
-                                                               ( 0 <= 描画距離dpx ) )  // バーを通過した。
-                                                       {
-                                                               チップ.ヒット済みである = true;
-                                                               チップ.不可視 = true;
-                                                               if( チップ.チップ種別 == SSTFormat.チップ種別.背景動画 )
-                                                               {
-                                                                       // (A) 背景動画の場合。
-                                                                       this.背景動画再生開始?.Invoke();
-                                                               }
-                                                               else
-                                                               {
-                                                                       // (B) その他のチップの場合。
-                                                                       this.チップヒット?.Invoke( チップ );
-                                                                       this.コンボ加算?.Invoke();
-                                                                       this.ヒット判定数加算?.Invoke( ヒット判定種別.AUTO );
-                                                                       this.ヒット判定文字列開始?.Invoke( チップ.チップ種別, ヒット判定種別.AUTO );
-                                                               }
-                                                       }
-                                                       //----------------
-                                                       #endregion
-                                                       #region " Miss 判定を行う。"
-                                                       //----------------
-                                                       if( ( チップ.ヒットされていない ) &&    // チップが未ヒット、かつ、
-                                                               ( this.ヒット判定を行うチップと対応するレーン.ContainsKey( チップ.チップ種別 ) ) && // チップがヒット判定対象である、かつ、
-                                                               ( 描画時間差sec > StrokeStyleT.ユーザ管理.現在選択されているユーザ.ヒット範囲sec.Poor ) )  // 描画時間差が Poor 範囲を超えている。
-                                                       {
-                                                               チップ.ヒット済みである = true;
-                                                               チップ.不可視 = true;
-                                                               this.コンボリセット?.Invoke();
-                                                               this.ヒット判定文字列開始?.Invoke( チップ.チップ種別, ヒット判定種別.MISS );
-                                                       }
-                                                       //----------------
-                                                       #endregion
+                                                       this.AutoPlayチップ判定を行う( チップ, 描画距離dpx );
+                                                       this.Miss判定を行う( チップ, 描画時間差sec );
                                                }
                                        }
                                }
@@ -219,6 +184,41 @@ namespace SST.ステージ.演奏
 
                        FDK.Log.Info( $"{FDK.Utilities.現在のメソッド名} <-- 終了" );
                }
+               private void AutoPlayチップ判定を行う( SSTFormat.チップ chip, double 描画距離dpx )
+               {
+                       if( ( chip.ヒットされていない ) &&    // チップが未ヒット、かつ、
+                               ( StrokeStyleT.ユーザ管理.現在選択されているユーザ.チップが自動演奏である( chip.チップ種別 ) ) &&    // チップの AutoPlay が ON、かつ、
+                               ( 0 <= 描画距離dpx ) )  // バーを通過した。
+                       {
+                               chip.ヒット済みである = true;
+                               chip.不可視 = true;
+                               if( chip.チップ種別 == SSTFormat.チップ種別.背景動画 )
+                               {
+                                       // (A) 背景動画の場合。
+                                       this.背景動画再生開始?.Invoke();
+                               }
+                               else
+                               {
+                                       // (B) その他のチップの場合。
+                                       this.チップヒット?.Invoke( chip );
+                                       this.コンボ加算?.Invoke();
+                                       this.ヒット判定数加算?.Invoke( ヒット判定種別.AUTO );
+                                       this.ヒット判定文字列開始?.Invoke( chip.チップ種別, ヒット判定種別.AUTO );
+                               }
+                       }
+               }
+               private void Miss判定を行う( SSTFormat.チップ chip, double 描画時間差sec )
+               {
+                       if( ( chip.ヒットされていない ) &&    // チップが未ヒット、かつ、
+                               ( this.ヒット判定を行うチップと対応するレーン.ContainsKey( chip.チップ種別 ) ) && // チップがヒット判定対象である、かつ、
+                               ( 描画時間差sec > StrokeStyleT.ユーザ管理.現在選択されているユーザ.ヒット範囲sec.Poor ) )  // 描画時間差が Poor 範囲を超えている。
+                       {
+                               chip.ヒット済みである = true;
+                               chip.不可視 = true;
+                               this.コンボリセット?.Invoke();
+                               this.ヒット判定文字列開始?.Invoke( chip.チップ種別, ヒット判定種別.MISS );
+                       }
+               }
 
                private void 小節線拍線を1つ描画する( デバイスリソース dr, SSTFormat.チップ chip, float Ydpx )
                {