编辑:我可以看到,这在您的第一个编辑链接下被列为“ GDI方式”。即使在该站点上提供性能咨询,这仍然是一种不错的方法,我认为您可以轻松达到30fps。
根据此评论(我没有这样做的经验,我只是指的是这样做的人):
HDC hdc = GetDC(NULL); // get the desktop device context
HDC hDest = CreateCompatibleDC(hdc); // create a device context to use yourself
// get the height and width of the screen
int height = GetSystemMetrics(SM_CYVIRTUALSCREEN);
int width = GetSystemMetrics(SM_CXVIRTUALSCREEN);
// create a bitmap
HBITMAP hbDesktop = CreateCompatibleBitmap( hdc, width, height);
// use the previously created device context with the bitmap
SelectObject(hDest, hbDesktop);
// copy from the desktop device context to the bitmap device context
// call this once per 'frame'
BitBlt(hDest, 0,0, width, height, hdc, 0, 0, SRCCOPY);
// after the recording is done, release the desktop context you got..
ReleaseDC(NULL, hdc);
// ..delete the bitmap you were using to capture frames..
DeleteObject(hbDesktop);
// ..and delete the context you created
DeleteDC(hDest);
我并不是说这是最快的,但是BitBlt
如果要在兼容的设备上下文之间进行复制,则操作通常会非常快。
作为参考,Open Broadcaster Software在其“ dc_capture” 方法中实现了类似的功能,尽管与其使用DirectX 10+的而不是hDest
使用CreateCompatibleDC
它们创建目标上下文IDXGISurface1
。如果没有对此的支持,他们会退回到CreateCompatibleDC
。
要改变它使用一个特定的应用程序,您需要更改的第一行到GetDC(game)
这里game
是游戏的窗口的句柄,然后设置权height
和width
游戏的窗口太多。
将像素放置在hDest / hbDesktop中之后,您仍然需要将其保存到文件中,但是如果您要进行屏幕捕获,那么我想您希望将一定数量的像素缓冲在内存中并保存到视频文件中以块为单位,因此我不会指向用于将静态映像保存到磁盘的代码。