1

SlimDXベースのゲームエディタがあるとしましょう。基本的にデバイスのすべての状態を制御し、失われたデバイスを処理し、デバイスを作成するなどのDeviceContextインスタンスがあります。エディターは、レンダリングが行われている場所で常にビューポートを開いているとは限りません。代わりに、さまざまなエディター、シーンエディター、テクスチャビューアー/エディター、アニメーションエディター、マテリアルエディターなどが含まれています。

ここで、ユーザーがSceneEditor(4つのビューがパネルにレンダリングされたダイアログ)を開いたとします。エディターがインスタンス化されると、DeviceContextから参照を取得し、「null」が見つかった場合は、context.CreateDevice(Control ctrl)を呼び出します。この方法は、デバイスが紛失、無効化、または廃棄されないことを「保証」します。もしそうなら、それは何が起こっているかに基づいてそれを処理します。これで、エディターは、デバイスの作成/リセット時に使用するコントロール(パネル)の「CreateDevice」メソッドを送信します。このコントロールは、TopLeftビューを表すパネルです。次に、コンテキストから「デバイス」参照を取得し、そのスワップチェーンビュー(他の3つのビューポートパネル)を作成します。

ここで、ユーザーがModelViewerダイアログを開いたとします。これも、デバイスインスタンスが「null」でないことを確認します。その場合、DeviceContext.CreateDevice(ModelViewPanel)を呼び出し、そこからデバイス参照を取得します。デバイスがnullでない場合、そのビュー(モデルがレンダリングされる場所)のスワップチェーンが作成されます。

これで、4つのビュー(TopLeft PanelがDeviceオブジェクトの作成に使用されるコントロール)と、スワップチェーンとして作成された他の3つのPanelオブジェクトを備えたシーンエディターができました。次に、ユーザーが開いたModelViewerがあります。これには、スワップチェーンとして作成された単一のパネルがあります。

私の質問は次のとおりです。シーンエディターにはデバイスインスタンスを最初に作成したコントロールがあるので、ユーザーがシーンエディターを閉じた場合はどうすればよいですか?Devi)ce.Reset()を呼び出すか、ModelViewerのプレゼンテーションパラメーターを使用して「新しい」Device()を作成しますか?

何かが理解されていない場合は、質問をリファクタリングするように依頼してください。ありがとうございます。

4

2 に答える 2

1

私の質問は次のとおりです。シーンエディターにはデバイスインスタンスを最初に作成したコントロールがあるので、ユーザーがシーンエディターを閉じた場合はどうすればよいですか?Devi)ce.Reset()を呼び出すか、ModelViewerのプレゼンテーションパラメーターを使用して「新しい」Device()を作成しますか?

基本的に、ユーザーがデバイスを作成したコントロールを破棄した場合は、新しいコントロール(およびウィンドウハンドル)に基づいて新しいデバイスを作成する必要があります。

すでにスワップチェーンを使用しているので、別の非常に優れたオプションは、(非表示の)1ピクセルのコントロールを作成し、これを使用してデバイスを作成することです。次に、スワップチェーンを使用して、個々のサーフェスをすべて作成します。

もちろん、ここでの利点は、そのHWND(1ピクセルコントロールのハンドル)をアプリケーションの存続期間中存続させることができることです。ユーザーがデバイスを破壊する心配はもうありません。

于 2010-02-14T06:06:28.327 に答える
0

デザインで説明していると思われる主要な問題は、同じこと、つまりデバイスの作成を担当する2つの異なるクラスがあることです。

その代わりに、クラスをリファクタリングして別のクラスにその責任を与え、構築時にそのクラスへの参照をフォームに与えることを検討してください。

于 2010-02-14T06:20:31.697 に答える