我需要一种方法来获取屏幕数据并将其传递到我的应用程序中的DX9表面/纹理,并以至少1600 * 900分辨率下的25fps渲染它,30更好。
我尝试了位块传输,但即使在此之后,我也只有20fps,在加载数据到纹理并呈现它后,我只有11fps,这远远低于我所需的速度。
GetFrontBufferData不可行。 在这里是关于使用Windows Media API的内容,但我不熟悉它。示例直接保存数据到文件,也许可以设置为提供单个帧,但我没有找到足够好的文档以自己尝试。
我的代码:
我发现对于512*512的正方形,它以30fps运行(例如490*450在20-25),所以我尝试分割屏幕,但似乎效果不佳。 如果代码中有遗漏,请务必写下来,而不是投票反对。谢谢。
我尝试了位块传输,但即使在此之后,我也只有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运行(例如490*450在20-25),所以我尝试分割屏幕,但似乎效果不佳。 如果代码中有遗漏,请务必写下来,而不是投票反对。谢谢。