2011-12-10 54 views
-1

的IDirect3DVertexBuffer9有方法Direct3D的VertexBuffer鎖()和unlock()函數不同D3DPOOL

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模式下如何實現。 幫助我~~

回答

3

在D3DPOOL_DEFAULT中,當全屏設備失去焦點並且設備「丟失」(D3DERR_DEVICENOTRESET或D3DERR_DEVICELOST)時,緩衝區內容會丟失。在這種情況下,緩衝區內的數據預計會存儲在視頻內存中。

在D3DPOOL_MANAGED中,數據副本(存儲在視頻內存中)存儲在系統內存中,因此當設備丟失時驅動程序將恢復它。

D3DPOOL_SCRATCH不支持頂點緩衝區。

D3DPOOL_SYSTEMMEM不能保證有更好的性能,因爲你會經常從系統內存傳輸數據到視頻內存以便使用這個頂點緩衝區。爲了在頻繁更新的緩衝區上獲得更好的性能,動態頂點緩衝區(請參閱D3DUSAGE_DYNAMIC,D3DLOCK_DISACRD,D3DLOCK_NOOVERWRITE)位於D3DPOOL_DEFAULT中。另外,Direct3D9文檔說,在系統內存中創建的資源通常無法訪問D3D9設備。對於從系統內存中進行渲染,有DrawIndexedPrimitiveUP和DrawPrimitiveUP,它們會在純D3D9設備上造成問題。

此外,絕對不能保證任一標誌都能讓設備按照您的想法工作。如果常識告訴你它應該以這種方式工作,但根據墨菲定律,這沒有記錄在規範中,它可能不會按照它應該的方式工作。對於所有實際的目的,只要符合Direct3D規範,驅動程序的實現可以由瘋狂的瘋子編寫。

另一件事是那些功能被記錄。 DirectX SDK附帶有幾個幫助文件 - * .chm,可以在任何Windows系統上讀取,.HxI/ .HxS集成到視覺工作室,另外還有online help on MSDN,其中包括對D3DPOOL的解釋。如果你問這樣的問題,你還沒有完成作業,也沒有閱讀文檔。所以請繼續閱讀。如果Direct3D9文檔不再包含在最新的SDK中,那麼只需將其更舊版本(2004年夏季)即可。