如何在视频内存中获取后台缓冲区副本?

时间:2013-09-12 02:38:31

标签: directx direct3d directx-9

现在我可以通过

获得名为pBackBuffer的后备缓冲区指针
m_pDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, 
    IREF_GETPPTR(pBackBuffer,IDirect3DSurface9));

然后通过

在系统内存中创建一个名为pSurfTemp的表面
m_pDevice->CreateOffscreenPlainSurface(
    g_Proc.m_Stats.m_SizeWnd.cx, g_Proc.m_Stats.m_SizeWnd.cy, 
    s_bbFormat, D3DPOOL_SYSTEMMEM, 
    IREF_GETPPTR(pSurfTemp,IDirect3DSurface9), NULL );

然后我通过

获取后台缓冲区数据
m_pDevice->GetRenderTargetData(pBackBuffer, pSurfTemp);

数据似乎正在变换:videoMemory-> systemMemory

由于下一步是再次操作视频内存中的数据,它会将其从系统内存复制回视频内存。这浪费时间。

我想复制视频内存中的数据,我该怎么做?

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您需要CreateOffscreenPlainSurface() D3DPOOL_DEFAULT标志,因此驱动程序会自动选择合适的内存位置。但它永远不能保证它始终是视频卡的机载内存。

顺便说一句,premature optimization is the root of all evil。 =)

编辑:另一种选择是将API从DirectX 9(已过时)切换到DirectX 11,这样可以实现更精确的资源操作。此外,OpenGL介于两者之间。两者都是一个巨大的代码重写。