我需要一些方法来获取屏幕数据并将它们传递给我的应用程序中的 DX9 表面/纹理,并在1600*900分辨率下以至少25fps的速度渲染它,30 会更好。
我尝试了 BitBliting,但即使在那之后我还是 20fps,并且在将数据加载到纹理并渲染它之后,我还是 11fps,这远远落后于我的需要。
GetFrontBufferData 是没有问题的。
这是有关使用 Windows Media API的一些内容,但我不熟悉它。示例正在将数据直接保存到文件中,也许可以将其设置为为您提供单独的帧,但我还没有找到足够好的文档来自己尝试。
我的代码:
m_memDC.BitBlt(0, 0, m_Rect.Width(),m_Rect.Height(), //m_Rect is area to be captured
&m_dc, m_Rect.left, m_Rect.top, SRCCOPY);
//at 20-25fps after this if I comment out the rest
//DC,HBITMAP setup and memory alloc is done once at the begining
GetDIBits( m_hDc, (HBITMAP)m_hBmp.GetSafeHandle(),
0L, // Start scan line
(DWORD)m_Rect.Height(), // # of scan lines
m_lpData, // LPBYTE
(LPBITMAPINFO)m_bi, // address of bitmapinfo
(DWORD)DIB_RGB_COLORS); // Use RGB for color table
//at 17-20fps
IDirect3DSurface9 *tmp;
m_pImageBuffer[0]->GetSurfaceLevel(0,&tmp); //m_pImageBuffer is Texture of same
//size as bitmap to prevent stretching
hr= D3DXLoadSurfaceFromMemory(tmp,NULL,NULL,
(LPVOID)m_lpData,
D3DFMT_X8R8G8B8,
m_Rect.Width()*4,
NULL,
&r, //SetRect(&r,0,0,m_Rect.Width(),m_Rect.Height();
D3DX_DEFAULT,0);
//12-14fps
IDirect3DSurface9 *frameS;
hr=m_pFrameTexture->GetSurfaceLevel(0,&frameS); // Texture of that is rendered
pd3dDevice->StretchRect(tmp,NULL,frameS,NULL,D3DTEXF_NONE);
//11fps
我发现对于 512*512 正方形,它以 30fps 的速度运行(即 20-25 的 490*450),所以我尝试分割屏幕,但似乎效果不佳。
如果代码中缺少某些内容,请写下来,不要投反对票。谢谢