2

現在、XNA ゲーム用のウィンドウ システムをゼロから作成しています。私は主に Windows 向けに開発していますが、将来どのプラットフォームをサポートするかは誰にもわかりません。パフォーマンスのセマンティクスは似ているはずなので、ネイティブ Direct3D についてこれを知っている場合は、自由に答えてください。可能であれば、ターゲット プラットフォームが X-Box 360 である場合に何が変わるかを検討してください。

私は順調に進んでいますが、ウィンドウを正確にレンダリングする方法がわかりません。私は4つのアプローチを思い付きました:

  • すべてのコントロールを画面に直接レンダリングするだけです。これが私が今していることです。コントロールは、半透明でない限り、状態をブレンドしてアニメーション化できます。任意の数の状態の間でアニメーション化する良い方法が見つかりませんでした (現在、ボタンアップからボタンダウン、マウスアウトからマウスオーバーにアニメーション化されているボタンが無効になっているとします。最後の状態から新しい状態にスムーズにブレンドします。このアプローチでは、最後のアニメーションが終了した後に 1 つのアニメーションが再生される場合にのみ機能します。そうしないと、アニメーションにジャンプが発生します。

  • 各トップレベル ウィンドウとすべてのコントロールをレンダー ターゲットにレンダリングし、それを使用して半透明のトップレベル ウィンドウを画面にレンダリングします。これにより、トップレベルの作業で半透明になり、管理が容易になりますが、アニメーションの内容は変わりません。

  • 各コントロールをレンダー ターゲットにレンダリングします。レンダー ターゲットは、コントロールがダーティになった場合 (つまり、アニメーション化する必要があるか、テキストが変更された場合) にのみ更新されます。このようにして、コントロールごとの半透明が機能します。

  • 前と同様ですが、アニメーションの問題を解決することに加えて、各コントロールに 2 番目のレンダー ターゲットを用意します。アニメーションが開始するたびに、レンダー ターゲットを交換して、アニメーションが開始したときの状態を取得し、それを目的の状態とブレンドして他のレンダー ターゲットに入れます。これにより、以前のアプローチよりもオーバーヘッドが増えることはありません。レンダー ターゲットの数が 2 倍になり、任意のフレームで (最大で) 1 つだけがレンダリングされます。しかし、ここで問題が発生します。これを機能させるには、「古い」レンダー ターゲットのコンテンツを保持する必要があります。これは、Windows では良好なパフォーマンスで動作するはずですが、X-Box 360 ではパフォーマンスに重大な影響があるようです。一方、「保存」ビットは、アニメーションがアクティブな間のみ必要です。

そして、実際の質問が来ます。明確にするものは何でも大歓迎です。パフォーマンスの問題については、これはゲームのウィンドウ システムにすぎないことを覚えておいてください。ゲームの背後にあるゲームは、多くのレンダー ターゲットを使用し、パフォーマンスも低下させる可能性があり、ウィンドウ システムよりもはるかに多くの可能性があります。最悪の場合、画面上にそれぞれ 20 ~ 40 のコントロールを持つ 5 つのトップレベル ウィンドウがあるとします。

  • これらのアプローチのどれをお勧めしますか?またその理由は? もちろん、別のアプローチを自由に追加してください。
  • 200 個または 400 個のレンダー ターゲットを利用できる場合、各フレームに 20 個しかレンダリングされない場合、パフォーマンスに影響はありますか?
  • PreserveContents のパフォーマンスへの影響は、X-Box 360 では本当に悪いのでしょうか? Windowsではどれくらい悪いですか?
  • RenderTarget2D.RenderTargetUsage プロパティに書き込むことができます。PreserveContents を必要に応じてのみ有効にするために、実行時にこれを切り替えることは良い考えですか?
  • ボタンの上にマウスを移動し、マウスを移動してから再び移動するなど、特定の状況でコントロールアニメーションがジャンプすることを (プレイヤーとして) 気にしますか?あなたより遅い?
4

3 に答える 3

4

Xbox 360用に開発している場合は、レンダリングターゲットに注意する必要があります。Xbox 360には、画面でのレンダリングに使用されるものを含め、レンダリングターゲットを保持するための特別なメモリ(10MB)があります。

10MBを超えない限り、すべてのレンダーターゲットがこの特別なメモリに保存されるため、PreserveContentsを使用しても、あるレンダーターゲットから別のレンダーターゲットに切り替えても影響はありません。

ただし、PreserveContentsを使用して10MBを超えるレンダーターゲットがある場合、この属性は、レンダーターゲットを通常のメモリから常に元に戻すことによってエミュレートする必要があります。

したがって、レンダリングターゲットの数は、それらのターゲットの合計サイズほど重要ではありません。次の式を使用して、レンダリングターゲットのサイズを知ることができます。

size (bits) = width  x height x color data size (bits)

Xbox 360のカラーデータサイズは32ビットであるため、例として、ライブラリのユーザーがメインターゲット以外のレンダリングターゲットのみを使用してHDでゲームを開発している場合、次を使用します。

3,515625MB = 29491200 bits = 1280 x 760 x 32 bits

また、レンダリングターゲットを動的に作成することは避けてください。費用がかかりすぎます。ゲームの開始時に割り当てられた静的レンダリングターゲットのプールを作成し、GUIコンポーネントにそれらを要求させる必要があります。

于 2009-07-15T20:32:36.473 に答える
3
  • If you want that level of control with animations (ie. having multiple going on the same control at once) then you're going to have do multiple passes. So either enable this kind of thing in a shader and do multiple passes with the shader, or do the standard Render->Resolve->Rerender loop.
  • There is indeed a performance hit creating that many rendertargets. It's not a good idea to create that many. You're better off having a smaller number of render targets of a larger size, and write multiple controls to that target.
  • It's been ages since I did any 360 dev (bugger :( ), but from what i can rememeber, it's not really that great. I'd avoid this option unless absolutely necessary. Hopefully someone with more up to date experience can help here.
  • This might work at runtime, but may involve a fair bit of work behind the scenes. I wouldn't expect that to perform too well. I'm sure it's fine if you're not doing it in the middle of a render loop.
  • I think that jumpy animations would definitely suck. Imho :)
于 2008-12-09T12:02:20.340 に答える