调用Windows API截图要50ms一张图,那么那些录屏软件是如何做到60FPS的速度的呢?

昨天无意间发现PIL截图和Python调用WinAPI截图速度差异好大,就详细测了测速度。 却发现就算是WinAPI的速度也难以做到60FPS,请问录…
关注者
420
被浏览
276,162

13 个回答

用gdi截图也快不了多少的,很难达到60帧/s的捕获速度。主流的方式一般是dx下钩子捕获后缓冲(OBS Studio,一般用来捕获游戏),桌面复制(Desktop Duplication,WIN8后才支持)。比较非主流的方式有rdp(严格的说不算截屏了,因为截到的不是屏幕画面而是绘制用的数据),还有其他楼说的镜像驱动也是一个办法,就是兼容性可能有点问题,不支持WDDM的系统(也就是NT6以上)。

顺便提一下,用D3D直接截取前缓冲是不行的,速度和GDI一样慢,因为在现代OS里最终画面都是直接在GPU上输出的。截取前缓冲相当于把GPU最终输出的画面又从显存拷回内存了。这个速度是非常慢的,可以达到ms级的延迟。OpenGL的glReadPixels也是同理。

如果要稳定保持60帧/s的速度,那么就只能在显存里多留几个画面的备份,每次渲染当前帧是备份当前画面并异步地把一~两帧前的画面传递给内存,这样只要保证你渲染当前帧的时候三帧前的画面已经从显存传递到内存就好了。(假设当前帧率是60fps,那么只要保证从显存to内存拷贝一张画面在3/60秒以内完成就可以了) ——该方法来自OBS Studio

WinXP/Win7的截屏技术不太清楚,印象里用Mirror Driver是最快的。

Win8.1/Win10用DXGI性能最好,官方推荐C/C++编写。

DXGI文档:

learn.microsoft.com/en-

Desktop Duplication API文档:

learn.microsoft.com/en-

Desktop Duplication API Sample:

github.com/microsoftarc

2018.5.15补充

一个DXGI+FFMPEG的录屏项目:

github.com/MathewSachin