現在、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 を必要に応じてのみ有効にするために、実行時にこれを切り替えることは良い考えですか?
- ボタンの上にマウスを移動し、マウスを移動してから再び移動するなど、特定の状況でコントロールアニメーションがジャンプすることを (プレイヤーとして) 気にしますか?あなたより遅い?