3

XNAのレンダリングターゲットは揮発性であることを理解していますが、どの程度揮発性ですか?内容がいつ破棄されるかを正確に示すドキュメントが見つかりません。それはあなたが彼らに絵を描き始めたときだけですか、それともいつでもそうなる可能性がありますか?

レンダリングターゲットに一度描画してから、それをTexture2Dとして無期限に使用したいと思います。これは可能ですか?RenderTargetUsage.PreserveContentsこれを正しく機能させるには、有効にする必要がありますか?PreserveContentsはXboxと電話のハードウェアで非常に遅いことを読みました。

4

2 に答える 2

7

Jonathan は についてすばらしい説明をしてくれましたが、 a を aとしてRenderTargetUsage使用することを含む、元の質問に関していくつかのことを明確にしたいと思います。RenderTarget2DTexture2D

簡単に言えば、RenderTargetUsageデバイス上でレンダー ターゲットとして設定されたときのサーフェスの動作を制御します。内容を保存するように設定されていない場合は、クリアされます。Xbox 360 では、これはハードウェアの癖として発生します (パフォーマンスのため)。Windows では、設定時にサーフェスをクリアするだけで Xbox 360 に一致するようにエミュレートされます。

ただし、テクスチャとして使用している場合、これは関係ありません。以前のコンテンツを失うことなく、1 つのサーフェスに複数回レンダリングする (毎回デバイスに設定する) 場合にのみ問題になります。

ゲームの開始時にレンダー ターゲットとして 1 回だけ設定した場合、再度レンダー ターゲットとして設定されることはないため、保存設定が何であっても問題ありません。

気にするのはIsContentLostプロパティ ( MSDN ) またはContentLostイベント ( MSDN ) です。これらは、レンダー ターゲットにレンダリングしたコンテンツが失われた場合に設定または発生します (デバイスの変更が原因で、たとえばフルスクリーンになる)。

フレームごとにレンダー ターゲットを再レンダリングする場合は、コンテンツの損失を確認する必要はありません。ただし、ゲームの開始時にレンダー ターゲットを作成し、それを引き続き使用する場合は、それらが作成されたフレームの後に失われていないことを確認する必要があります。

(呼び出しの途中でコンテンツが失われることを心配する必要はないことに注意してくださいDraw。これはフレーム間でのみ発生する可能性があると確信しています。)

于 2011-08-01T14:51:11.940 に答える
4

まず、RenderTargetUsage.PreserveContentsあなたの読みに関しては正しいです。(少なくとも XBox では) ハードウェアの制限がいくつかあり、バック バッファーの内容をネイティブに保持することはできません。これは、破棄が発生する前にシステム RAM にコピーし、後でコピーして戻す必要があることを意味します。

バッファーの内容は、アクティブなレンダー ターゲットとして設定されると破棄されます。これは、それらが反転された後 (プライマリ フリップ チェーンの一部である場合は、すべての Draw ループの最後)、またはアクティブなレンダー ターゲットの 1 つとして設定されたときに破棄されることを意味します。

アプリケーション ( DirectX SDK パッケージの一部) の開発中に DirectX 開発者ランタイムをインストールするかどうか迷っている場合は、バック バッファーを強制的にクリアするオプションがあります (PC プラットフォームでは、バック バッファーが破棄されることが保証されていないためです。 PreserveContents が設定されていない場合)。

于 2011-08-01T11:51:51.543 に答える