不同D3DPOOL实现的Direct3D VertexBuffer Lock()和Unlock()函数



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指向它。解锁方法是将内存复制到真正的显存。这种方法通过在硬件中放置抽象层来消除差异。

我猜:在'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模式中实现。帮助我~ ~

在D3DPOOL_DEFAULT中,当全屏设备失去焦点和设备"丢失"时,缓冲区内容丢失(D3DERR_DEVICENOTRESET或D3DERR_DEVICELOST)。在这种情况下,缓冲区内的数据预计将存储在显存中。

在D3DPOOL_MANAGED中,数据的副本(存储在显存中)存储在系统内存中,因此驱动程序将在设备丢失时恢复它。

D3DPOOL_SCRATCH不支持顶点缓冲区

D3DPOOL_SYSTEMMEM不能保证更好的性能,因为为了使用这个顶点缓冲区,您将频繁地将数据从系统内存传输到视频内存。为了在频繁更新的缓冲区上获得更好的性能,有动态顶点缓冲区(参见D3DUSAGE_DYNAMIC, D3DLOCK_DISACRD, D3DLOCK_NOOVERWRITE),它们位于D3DPOOL_DEFAULT中。此外,Direct3D9文档指出,在系统内存中创建的资源通常不能被D3D9设备访问。对于从系统内存中渲染,有drawwindexedprimitiveup和DrawPrimitiveUP,这必然会在纯D3D9设备上导致问题。

同样,绝对不能保证任何一个标志都能使设备按你想的那样工作。如果常识告诉你它应该这样工作,但在规范中没有记录,根据墨菲定律,它可能没有按应有的方式工作。为了所有的实际目的,驱动程序的实现可以由一个疯子来写,只要它符合Direct3D规范。

另一件事是这些函数是文档化的。DirectX SDK附带了几个帮助文件- *。. hxi/,可以在任何windows系统上读取。HxS集成到visual studio中,另外MSDN上有在线帮助,其中包括D3DPOOL的解释。如果你问这样的问题,说明你没有做功课,也没有阅读文档。所以请继续阅读。如果Direct3D9文档不再包含在最新的SDK中,那么只需使用旧版本(2004年夏天)。

最新更新