Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Direct3D VertexBuffer Lock()和Unlock()函数由不同的D3DPOOL实现_C++_Visual Studio_Directx_Vertex Buffer - Fatal编程技术网

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

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指向它。而“解

IDirect3DVertexBuffer9具有该方法

STDMETHOD(Lock)(THIS_ UINT OffsetToLock,UINT SizeToLock,void** ppbData,DWORD Flags) PURE
STDMETHOD(Unlock)(THIS) PURE
我不知道这些功能的内部实现。 我确实期待下一个

  • “锁定”方法将VertexBuffer的视频内存映射到ppbData。它获得了更高的性能

  • “Lock”方法分配一个系统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\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年夏天)