现在我可以通过以下方式获取名为pBackBuffer的backbuffer指针
m_pDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO,
IREF_GETPPTR(pBackBuffer,IDirect3DSurface9));
然后在 syetem 内存中创建一个名为 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
由于下一步是再次操作视频内存中的数据,因此它会将其从系统内存复制回视频内存。它浪费时间。
我想复制显存中的数据,我该怎么做?
如果我理解正确,您将希望使用D3DPOOL_DEFAULT
标志进行CreateOffscreenPlainSurface()
,因此驱动程序将自动选择适当的内存位置。但它从未保证它始终是显卡的板载内存。
顺便说一下,过早的优化是万恶之源。 =)
编辑:另一种选择是将API从DirectX 9(已过时)切换到DirectX 11,这允许更精确的资源操作。此外,OpenGL介于两者之间。两者都是一个巨大的代码重写。