2011-12-10 13 views
-1

IDirect3DVertexBuffer9は方法Direct3DのVertexBufferロック()と異なるD3DPOOLによって実装ロック解除()関数

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

が、私はこれらの関数の内部実装を知らないことがあります。 私は次のことを期待しています。

  1. 「ロック」メソッドは、VertexBufferのビデオメモリをppbDataにマップします。それは多くのfaterの性能を得る。

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

私は推測する: 'D3DPOOL_SYSTEMMEM' モードで が、それはD3DPOOL_DEFAULT 'モードで道2 によって実装、それは仕方1.

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

    D3DPOOL_FORCE_DWORD    = 0x7fffffff 
} D3DPOOL; 

によって実装が、私は知りませんすべてのD3DPOOLモードでどのように実装されていますか。フルスクリーンデバイスがフォーカスを失って、デバイスが「失われた」(D3DERR_DEVICENOTRESETまたはD3DERR_DEVICELOST)であるとき は~~ D3DPOOL_DEFAULTで

答えて

3

私を助けて、バッファの内容は失われます。この場合、バッファ内のデータはビデオメモリに格納されることが期待されます。

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

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

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

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

もう1つのことは、これらの機能が文書化されていることです。 DirectX SDKには、Visual Studioに統合された.HxI/ .HxSとonline help on MSDNというD3DPOOLの説明が含まれています。このような質問をしているなら、あなたは宿題をしておらず、ドキュメントを読んでいない。だからそれを読んでください。 Direct3D9のドキュメントが最新のSDKに含まれなくなった場合、古いバージョンのSDKを入手するだけです(2004年の夏)。

関連する問題