-1

IDirect3DVertexBuffer9 有这些方法

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

我不知道这些功能的内部实现。我确实期待下一个。

  1. 'Lock' 方法将 VertexBuffer 的视频内存映射到 ppbData。它获得了更多的性能。

  2. 'Lock' 方法是分配一个系统内存并使 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 模式下实现。帮帮我~~

4

1 回答 1

4

在 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 可以集成到 Visual Studio 中,另外还有MSDN 上的在线帮助,其中包括对D3DPOOL的解释。如果你问这样的问题,你还没有完成作业,也没有阅读文档。所以继续阅读吧。如果 Direct3D9 文档不再包含在最新的 SDK 中,那么只需获取它的旧版本(2004 年夏天)。

于 2011-12-11T00:13:36.353 回答