OSDN Git Service

ステージの活性化と非活性化を進行スレッドで行っていたミスを修正。
authorくまかみ工房 <kumakamikoubou@gmail.com>
Wed, 31 May 2017 09:38:19 +0000 (18:38 +0900)
committerくまかみ工房 <kumakamikoubou@gmail.com>
Wed, 31 May 2017 09:40:47 +0000 (18:40 +0900)
ステージ遷移処理を描画スレッドへ移設。

StrokeStyleT/App.cs

index 9fa3330..eb7017f 100644 (file)
@@ -277,23 +277,7 @@ namespace SST
 
                                                // 進行タスク起動。
                                                this._進行Status = new TriStateEvent( TriStateEvent.状態種別.OFF );
-                                               Task.Factory.StartNew( () => {
-
-                                                       Log.現在のスレッドに名前をつける( "進行" );
-                                                       Log.Info( "進行タスクを開始します。" );
-
-                                                       this._進行Status.現在の状態 = TriStateEvent.状態種別.ON;
-
-                                                       while( this._進行Status.現在の状態 == TriStateEvent.状態種別.ON )
-                                                       {
-                                                               this._進行処理を行う();
-                                                               Thread.Sleep( 1 );  // ウェイト。
-                                                       }
-
-                                                       this._進行Status.現在の状態 = TriStateEvent.状態種別.無効;
-
-                                                       Log.Info( "進行タスクを終了しました。" );
-                                               } );
+                                               Task.Factory.StartNew( this._進行タスクエントリ );
 
                                                // 描画タスク開始。
                                                this._AppStatus = AppStatus.実行中;
@@ -423,20 +407,89 @@ namespace SST
                /// <summary>
                ///             進行ループの処理内容。
                /// </summary>
-               private void _進行処理を行う()
+               private void _進行タスクエントリ()
+               {
+                       Log.現在のスレッドに名前をつける( "進行" );
+                       Log.Info( "進行タスクを開始します。" );
+
+                       this._進行Status.現在の状態 = TriStateEvent.状態種別.ON;
+
+                       while( this._進行Status.現在の状態 == TriStateEvent.状態種別.ON )
+                       {
+                               lock( this._進行描画間同期 )
+                               {
+                                       //App.入力管理.すべての入力デバイスをポーリングする();
+                                       // --> 入力ポーリングの挙動はステージごとに異なるので、それぞれのステージ内で行う。
+
+                                       App.ステージ管理.現在のステージ.進行する();
+                               }
+
+                               Thread.Sleep( 1 );  // ウェイト。
+                       }
+
+                       this._進行Status.現在の状態 = TriStateEvent.状態種別.無効;
+
+                       Log.Info( "進行タスクを終了しました。" );
+               }
+
+               /// <summary>
+               ///             描画ループの処理内容。
+               /// </summary>
+               private void _描画処理を行う()
                {
                        lock( this._進行描画間同期 )
                        {
-                               // ステージが遷移したら、ここへ goto すること。さもないと、描画が数フレーム遅れて黒画面が挟まることがある。
-                               retry:
+                               if( this._AppStatus != AppStatus.実行中 )  // 上記lock中に終了されている場合があるのでそれをはじく。
+                                       return;
+
+                               #region " (1) D3Dデバイスが消失していれば再構築する。"
+                               //----------------
+                               App.グラフィックデバイス.D3Dデバイスが消失していれば再構築する( out bool 再構築不能な異常が発生 );
+
+                               if( 再構築不能な異常が発生 )
+                               {
+                                       Log.WARNING( "再構築不能な異常が発生しました。アプリケーションを終了します。" );
+                                       this._アプリを終了する();
+                                       return;
+                               }
+                               //----------------
+                               #endregion
+
+                               var gd = App.グラフィックデバイス;
+
+                               #region " (2) D3Dレンダリングの前処理を行う。"
+                               //----------------
+                               gd.D3DDeviceを取得する( ( d3dDevice ) => {
+
+                                       using( var d3dContext = d3dDevice.ImmediateContext )
+                                       {
+                                               // 既定のD3Dレンダーターゲットビューを黒でクリアする。
+                                               d3dContext.ClearRenderTargetView( gd.D3DRenderTargetView, Color4.Black );
+
+                                               // 深度バッファを 1.0f でクリアする。
+                                               d3dContext.ClearDepthStencilView(
+                                                       gd.D3DDepthStencilView,
+                                                       SharpDX.Direct3D11.DepthStencilClearFlags.Depth,
+                                                       depth: 1.0f,
+                                                       stencil: 0 );
+                                       }
+
+                               } );
+                               //----------------
+                               #endregion
 
-                               //App.入力管理.すべての入力デバイスをポーリングする();
-                               // --> 入力ポーリングの挙動はステージごとに異なるので、それぞれのステージ内で行う。
+                               #region " (3) 現在のステージの描画を行う。"
+                               //----------------
+                               App.ステージ管理.現在のステージ.描画する( gd );
+                               //----------------
+                               #endregion
 
-                               // (1) 現在のステージの進行を行う。
-                               App.ステージ管理.現在のステージ.進行する();
+                               #region " (4) ステージの状態をチェックし、遷移処理を行う。(必要に応じてビュアーメッセージキューの処理も行う。)"
+                               //----------------
+
+                               // ステージが遷移したら、ここへ goto すること。さもないと、描画が1フレーム遅れて黒画面が挟まることがある。
+                               retry:
 
-                               // (2) ステージの状態をチェックし、遷移処理を行う。(必要に応じてビュアーメッセージキューの処理も行う。)
                                switch( App.ステージ管理.現在のステージ )
                                {
                                        case 起動ステージ stage:
@@ -444,7 +497,7 @@ namespace SST
                                                //----------------
                                                if( stage.現在のフェーズ == 起動ステージ.フェーズ.完了 )
                                                {
-                                                       App.ステージ管理.ステージを遷移する( App.グラフィックデバイス, nameof( タイトルステージ ) );
+                                                       App.ステージ管理.ステージを遷移する( gd, nameof( タイトルステージ ) );
                                                        goto retry;
                                                }
                                                //----------------
@@ -456,7 +509,7 @@ namespace SST
                                                //----------------
                                                if( stage.現在のフェーズ == タイトルステージ.フェーズ.確定 )
                                                {
-                                                       App.ステージ管理.ステージを遷移する( App.グラフィックデバイス, nameof( ユーザ選択ステージ ) );
+                                                       App.ステージ管理.ステージを遷移する( gd, nameof( ユーザ選択ステージ ) );
                                                        goto retry;
                                                }
                                                //----------------
@@ -465,7 +518,7 @@ namespace SST
                                                //----------------
                                                else if( stage.現在のフェーズ == タイトルステージ.フェーズ.キャンセル )
                                                {
-                                                       App.ステージ管理.ステージを遷移する( App.グラフィックデバイス, null );
+                                                       App.ステージ管理.ステージを遷移する( gd, null );
                                                        this._アプリを終了する();
                                                        //goto retry;   --> 終わりなので不要 つか無意味。
                                                }
@@ -478,7 +531,7 @@ namespace SST
                                                //----------------
                                                if( stage.現在のフェーズ == ユーザ選択ステージ.フェーズ.キャンセル )
                                                {
-                                                       App.ステージ管理.ステージを遷移する( App.グラフィックデバイス, nameof( タイトルステージ ) );
+                                                       App.ステージ管理.ステージを遷移する( gd, nameof( タイトルステージ ) );
                                                        goto retry;
                                                }
                                                //----------------
@@ -489,11 +542,11 @@ namespace SST
                                                {
                                                        if( App.ビュアーモードではない )
                                                        {
-                                                               App.ステージ管理.ステージを遷移する( App.グラフィックデバイス, nameof( 選曲ステージ ) );
+                                                               App.ステージ管理.ステージを遷移する( gd, nameof( 選曲ステージ ) );
                                                        }
                                                        else
                                                        {
-                                                               App.ステージ管理.ステージを遷移する( App.グラフィックデバイス, nameof( 演奏ステージ ) );
+                                                               App.ステージ管理.ステージを遷移する( gd, nameof( 演奏ステージ ) );
                                                        }
                                                        goto retry;
                                                }
@@ -506,7 +559,7 @@ namespace SST
                                                //----------------
                                                if( stage.現在のフェーズ == 選曲ステージ.フェーズ.キャンセル )
                                                {
-                                                       App.ステージ管理.ステージを遷移する( App.グラフィックデバイス, nameof( ユーザ選択ステージ ) );
+                                                       App.ステージ管理.ステージを遷移する( gd, nameof( ユーザ選択ステージ ) );
                                                        goto retry;
                                                }
                                                //----------------
@@ -515,7 +568,7 @@ namespace SST
                                                //----------------
                                                else if( stage.現在のフェーズ == 選曲ステージ.フェーズ.曲決定 )
                                                {
-                                                       App.ステージ管理.ステージを遷移する( App.グラフィックデバイス, nameof( 曲読込ステージ ) );
+                                                       App.ステージ管理.ステージを遷移する( gd, nameof( 曲読込ステージ ) );
                                                        goto retry;
                                                }
                                                //----------------
@@ -527,7 +580,7 @@ namespace SST
                                                //----------------
                                                if( stage.現在のフェーズ == 曲読込ステージ.フェーズ.完了 )
                                                {
-                                                       App.ステージ管理.ステージを遷移する( App.グラフィックデバイス, nameof( 演奏ステージ ) );
+                                                       App.ステージ管理.ステージを遷移する( gd, nameof( 演奏ステージ ) );
                                                        goto retry;
                                                }
                                                //----------------
@@ -543,7 +596,7 @@ namespace SST
                                                        if( ( stage.現在のフェーズ == 演奏ステージ.フェーズ.キャンセル ) ||
                                                                ( stage.現在のフェーズ == 演奏ステージ.フェーズ.Failed ) )
                                                        {
-                                                               App.ステージ管理.ステージを遷移する( App.グラフィックデバイス, nameof( 選曲ステージ ) );
+                                                               App.ステージ管理.ステージを遷移する( gd, nameof( 選曲ステージ ) );
                                                                goto retry;
                                                        }
                                                        //--------------------
@@ -552,7 +605,7 @@ namespace SST
                                                        //--------------------
                                                        else if( stage.現在のフェーズ == 演奏ステージ.フェーズ.クリア )
                                                        {
-                                                               App.ステージ管理.ステージを遷移する( App.グラフィックデバイス, nameof( クリアステージ ) );
+                                                               App.ステージ管理.ステージを遷移する( gd, nameof( クリアステージ ) );
                                                                goto retry;
                                                        }
                                                        //--------------------
@@ -580,17 +633,17 @@ namespace SST
                                                                                if( stage.現在のフェーズ == 演奏ステージ.フェーズ.演奏中 ||
                                                                                        stage.現在のフェーズ == 演奏ステージ.フェーズ.ビュアーメッセージ待機 )
                                                                                {
-                                                                                       stage.非活性化する( App.グラフィックデバイス );
+                                                                                       stage.非活性化する( gd );
 
                                                                                        stage.BGMを停止する();
 
                                                                                        if( ( null != App.ビュアー用ノード ) && App.ビュアー用ノード.活性化している )
-                                                                                               App.ビュアー用ノード.非活性化する( App.グラフィックデバイス );
+                                                                                               App.ビュアー用ノード.非活性化する( gd );
 
                                                                                        App.ビュアー用ノード = new MusicNode( msg.演奏対象曲のファイルパス, null );
 
                                                                                        // 曲読込ステージへ。
-                                                                                       App.ステージ管理.ステージを遷移する( App.グラフィックデバイス, nameof( 曲読込ステージ ) );
+                                                                                       App.ステージ管理.ステージを遷移する( gd, nameof( 曲読込ステージ ) );
                                                                                        goto retry;
                                                                                }
                                                                                break;
@@ -630,7 +683,7 @@ namespace SST
                                                //----------------
                                                if( stage.現在のフェーズ == クリアステージ.フェーズ.完了 )
                                                {
-                                                       App.ステージ管理.ステージを遷移する( App.グラフィックデバイス, nameof( 結果ステージ ) );
+                                                       App.ステージ管理.ステージを遷移する( gd, nameof( 結果ステージ ) );
                                                        goto retry;
                                                }
                                                //----------------
@@ -642,68 +695,18 @@ namespace SST
                                                //--------------------
                                                if( stage.現在のフェーズ == 結果ステージ.フェーズ.完了 )
                                                {
-                                                       App.ステージ管理.ステージを遷移する( App.グラフィックデバイス, nameof( 選曲ステージ ) );
+                                                       App.ステージ管理.ステージを遷移する( gd, nameof( 選曲ステージ ) );
                                                        goto retry;
                                                }
                                                //--------------------
                                                #endregion
                                                break;
                                }
-                       }
-               }
-
-               /// <summary>
-               ///             描画ループの処理内容。
-               /// </summary>
-               private void _描画処理を行う()
-               {
-                       lock( this._進行描画間同期 )
-                       {
-                               if( this._AppStatus != AppStatus.実行中 )  // 上記lock中に終了されている場合があるのでそれをはじく。
-                                       return;
-
-                               #region " (1) D3Dデバイスが消失していれば再構築する。"
-                               //----------------
-                               App.グラフィックデバイス.D3Dデバイスが消失していれば再構築する( out bool 再構築不能な異常が発生 );
-
-                               if( 再構築不能な異常が発生 )
-                               {
-                                       Log.WARNING( "再構築不能な異常が発生しました。アプリケーションを終了します。" );
-                                       this._アプリを終了する();
-                                       return;
-                               }
-                               //----------------
-                               #endregion
-
-                               #region " (2) D3Dレンダリングの前処理を行う。"
-                               //----------------
-                               App.グラフィックデバイス.D3DDeviceを取得する( ( d3dDevice ) => {
-
-                                       using( var d3dContext = d3dDevice.ImmediateContext )
-                                       {
-                                               // 既定のD3Dレンダーターゲットビューを黒でクリアする。
-                                               d3dContext.ClearRenderTargetView( App.グラフィックデバイス.D3DRenderTargetView, SharpDX.Color4.Black );
-
-                                               // 深度バッファを 1.0f でクリアする。
-                                               d3dContext.ClearDepthStencilView(
-                                                       App.グラフィックデバイス.D3DDepthStencilView,
-                                                       SharpDX.Direct3D11.DepthStencilClearFlags.Depth,
-                                                       depth: 1.0f,
-                                                       stencil: 0 );
-                                       }
-
-                               } );
-                               //----------------
-                               #endregion
-
-                               #region " (3) 現在のステージの描画を行う。"
-                               //----------------
-                               App.ステージ管理.現在のステージ.描画する( App.グラフィックデバイス );
                                //----------------
                                #endregion
                        }
 
-                       #region " (4) スワップチェーンを表示する。"
+                       #region " (5) スワップチェーンを表示する。"
                        //----------------
                        if( App.システム設定.垂直帰線待ちを行う )
                        {