C++ Direct3D VertexBuffer Lock()和Unlock()函数由不同的D3DPOOL实现
IDirect3DVertexBuffer9具有该方法C++ Direct3D VertexBuffer Lock()和Unlock()函数由不同的D3DPOOL实现,c++,visual-studio,directx,vertex-buffer,C++,Visual Studio,Directx,Vertex Buffer,IDirect3DVertexBuffer9具有该方法 STDMETHOD(Lock)(THIS_ UINT OffsetToLock,UINT SizeToLock,void** ppbData,DWORD Flags) PURE STDMETHOD(Unlock)(THIS) PURE 我不知道这些功能的内部实现。 我确实期待下一个 “锁定”方法将VertexBuffer的视频内存映射到ppbData。它获得了更高的性能 “Lock”方法分配一个系统mem,并使ppbData指向它。而“解
STDMETHOD(Lock)(THIS_ UINT OffsetToLock,UINT SizeToLock,void** ppbData,DWORD Flags) PURE
STDMETHOD(Unlock)(THIS) PURE
我不知道这些功能的内部实现。
我确实期待下一个
/* Pool types */
typedef enum _D3DPOOL {
D3DPOOL_DEFAULT = 0,
D3DPOOL_MANAGED = 1,
D3DPOOL_SYSTEMMEM = 2,
D3DPOOL_SCRATCH = 3,
D3DPOOL_FORCE_DWORD = 0x7fffffff
} D3DPOOL;
但我不知道如何在每个D3DPOOL模式下实现。
帮助我~~在D3DPOOL\u默认情况下,当全屏设备失去焦点且设备“丢失”(D3DERR\u DEVICENOTRESET或D3DERR\u DEVICELOST)时,缓冲区内容将丢失。在这种情况下,缓冲区内的数据预计将存储在视频存储器中 在D3DPOOL_MANAGED中,数据的副本(存储在视频内存中)存储在系统内存中,因此,当设备丢失时,驱动程序将恢复该副本 顶点缓冲区不支持D3DPOOL_SCRATCH D3DPOOL_SYSTEMMEM不能保证更好的性能,因为为了使用这个顶点缓冲区,您需要频繁地将数据从系统内存传输到视频内存。为了在频繁更新的缓冲区上获得更好的性能,有一些动态顶点缓冲区(请参阅D3DUSAGE_dynamic、D3DLOCK_DISACRD、D3DLOCK_NOOVERWRITE),它们位于D3DPOOL_DEFAULT中。此外,Direct3D9文档指出,D3D9设备通常无法访问在系统内存中创建的资源。对于从系统内存进行渲染,有DrawIndexedPrimitiveUP和DrawPrimitiveUP,它们必然会在纯D3D9设备上引起问题 而且,绝对不能保证任何一个标志都能使设备按您的想法工作。根据墨菲定律,如果常识告诉你应该以这种方式工作,但规范中并没有对此进行记录,那么它可能不会以应有的方式工作。出于所有实际目的,驱动程序实现可以由疯狂的疯子编写,只要它符合Direct3D规范 另一件事是,这些函数都有文档记录。DirectX SDK附带了几个帮助文件-*.chm,可以在任何集成到visual studio的windows系统上读取,.HxI/.HxS,另外还有一个,其中包括对的解释。如果你问这样的问题,说明你没有做家庭作业,也没有阅读文档。那就继续读吧。如果Direct3D9文档不再包含在最新的SDK中,那么只需获取它的旧版本(2004年夏天)