XNA4.0でシンプルな3Dモデルビューアを開発しています。描画機能と更新機能で無限のゲームループを回避する方法はありますか?3Dグラフィックスをレンダリングする必要がありますが、シーンを無限にレンダリングする必要はありません。つまり、シーンを再描画する必要があるのは、それが実際に変わったときだけです。
4 に答える
サンプルで彼らがどのようにそれを行っているかを見てみることをお勧めします。
なぜこれが欲しいのですか?
winformsアプリケーションを使用する場合は、更新と描画のループをより細かく制御できますが、最初にシーンをテクスチャにレンダリングしてから、レンダリングを完全に停止することもできます。
独自のマルチスレッドループをロールする必要があります。どちらか一方をストールするUpdate
とDraw
、もう一方もストールします。もう1つの考慮事項は、ウィンドウが何らかの理由で(DWM以外の環境、たとえばウィンドウが重なっている場合)ストールするDraw
と、ウィンドウの領域がペイントされないままになることです。
これを進めたい場合は、あなたがすることはThread
、最初Update
に呼び出されたときに開始し、その後、を使用しManualResetEvent
て2つを同期することです。
はるかに堅牢なオプションはRenderTarget2D
、シーンが更新されたときにシーン全体をレンダリングすることです。シーンが最後から変更されていない場合、Update
または呼び出しは、シーン全体ではなくDraw
単にレンダリングします。RenderTarget2D
これはまだ無限ループですが、(それが満たされていない場合でも)要件に近づく傾向があります。
この種のシナリオは、レンダリングシステムのホストとしてWinFormsまたはWPFを使用することで最もよく解決されます。私は以前にそのようなシステムで作業したことがあり、 WPF相互運用機能でSlimDXを使用することが私の好ましい解決策であることがわかりました。このアプローチを使用すると、WPFによって提供される優れたUI機能を、サーフェスにレンダリングされた3Dモデルにオーバーレイして追加できます。