-1

IDirect3DVertexBuffer9 にはそのメソッドがあります

STDMETHOD(Lock)(THIS_ UINT OffsetToLock,UINT SizeToLock,void** ppbData,DWORD Flags) PURE
STDMETHOD(Unlock)(THIS) PURE

これらの関数の内部実装がわかりません。私は次を期待しています。

  1. 「Lock」メソッドは、VertexBuffer のビデオ メモリを ppbData にマップします。はるかに優れたパフォーマンスが得られます。

  2. 'Lock' メソッドは、system-mem を割り当て、それを指すように ppbData を作成します。そして、「UnLock」メソッドは、そのメモリを実際のビデオ メモリにコピーします。ハードウェアに抽象化レイヤーを配置することによるこのアプローチは、違いを排除します。

私はそれを推測します:「D3DPOOL_SYSTEMMEM」モードでは、方法2で実装されました.「D3DPOOL_DEFAULT」モードでは、方法1で実装されました.

/* Pool types */
typedef enum _D3DPOOL {
    D3DPOOL_DEFAULT                 = 0,
    D3DPOOL_MANAGED                 = 1,
    D3DPOOL_SYSTEMMEM               = 2,
    D3DPOOL_SCRATCH                 = 3,

    D3DPOOL_FORCE_DWORD             = 0x7fffffff
} D3DPOOL;

しかし、すべての D3DPOOL モードでどのように実装されているかはわかりません。助けて~~

4

1 に答える 1

4

D3DPOOL_DEFAULT では、フルスクリーン デバイスがフォーカスを失い、デバイスが「失われる」 (D3DERR_DEVICENOTRESET または D3DERR_DEVICELOST) と、バッファーの内容が失われます。この場合、バッファ内のデータはビデオ メモリに格納されることが期待されます。

D3DPOOL_MANAGED では、データのコピー (ビデオ メモリ内に格納されている) がシステム メモリに格納されているため、デバイスが失われたときにドライバーによって復元されます。

D3DPOOL_SCRATCH は、頂点バッファーではサポートされていません。

D3DPOOL_SYSTEMMEM は、この頂点バッファーを使用するためにシステム メモリからビデオ メモリに頻繁にデータを転送するため、パフォーマンスの向上は保証されません。頻繁に更新されるバッファーのパフォーマンスを向上させるために、D3DPOOL_DEFAULT にある動的頂点バッファー (D3DUSAGE_DYNAMIC、D3DLOCK_DISACRD、D3DLOCK_NOOVERWRITE を参照) があります。また、Direct3D9 のドキュメントには、システム メモリに作成されたリソースは、通常、D3D9 デバイスからはアクセスできないと記載されています。システム メモリからのレンダリングには、純粋な D3D9 デバイスで問題を引き起こす可能性のある DrawIndexedPrimitiveUP と DrawPrimitiveUP があります。

また、どちらのフラグでもデバイスが思いどおりに動作するという保証はまったくありません。マーフィーの法則によれば、常識的にはこのように動作するはずですが、これが仕様に記載されていない場合は、おそらく本来の方法で動作しません。すべての実用的な目的のために、ドライバーの実装は、Direct3D 仕様に準拠している限り、非常識な狂人によって記述される可能性があります。

もう1つのことは、それらの機能が文書化されていることです。DirectX SDK には、いくつかのヘルプ ファイル (任意の Windows システムで読み取ることができる *.chm、 Visual Studio に統合される.HxI/ .HxS、およびD3DPOOLの説明を含むMSDN のオンライン ヘルプ)が付属しています。このような質問をしている場合は、宿題を行っておらず、ドキュメントも読んでいません。だから先に進んでそれを読んでください。Direct3D9 ドキュメントが最新の SDK に含まれていない場合は、古いバージョン (2004 年夏) を入手してください。

于 2011-12-11T00:13:36.353 に答える