如何突破Python中mss屏幕捕获的60fps帧率限制?
突破mss屏幕捕获60fps限制的解决方案
核心思路
你的问题根源在于mss默认使用的GDI后端依赖BitBlt等API,这些API会强制同步到显示器的刷新周期(60Hz),导致帧率被锁。要突破限制,核心是绕过GDI的垂直同步机制,改用更高效的捕获方式。
可行方案
1. 切换到mss的DXGI后端(推荐)
mss支持DXGI(DirectX Graphics Infrastructure)捕获后端,它直接从GPU显存读取帧数据,完全绕过GDI的同步逻辑,不受显示器刷新率限制,轻松突破60fps。
启用方式非常简单,只需在创建mss实例时指定backend='dxgi':
import mss # 使用DXGI后端初始化屏幕捕获 with mss.mss(backend='dxgi') as sct: # 捕获主显示器(根据需要调整monitor索引) monitor = sct.monitors[1] while True: # 高速捕获帧 frame = sct.grab(monitor) # 此处添加帧处理逻辑
这个方案无需修改源码,兼容性好(支持Win10及以上系统),大部分场景下能直接达到数百fps的捕获速率。
2. 修改mss的GDI后端实现(进阶)
如果因特殊原因必须使用GDI后端,可以修改mss的Windows GDI源码,替换导致同步的API:
- 将
CreateCompatibleBitmap替换为CreateDIBSection:兼容位图会依赖显示器设备上下文,强制同步;而DIBSection是内存中的位图,不与显示器刷新绑定。 - 调整
GetDIBits的调用方式:直接从DIBSection读取像素数据,避免不必要的等待。
修改后重新编译mss即可,但这种方式需要对Windows GDI API有一定了解,且维护成本较高。
3. 禁用全局垂直同步
在显卡驱动设置中关闭全局垂直同步(V-Sync),部分场景下可以解除GDI API的同步限制。但此方法会影响全局显示效果,仅作为备选方案。
补充说明
你看到的其他用户能达到600fps,基本都是使用了DXGI或类似的GPU级捕获方式,完全避开了GDI的同步机制。所以优先尝试DXGI后端是最高效的解决路径。
内容的提问来源于stack exchange,提问作者BappoHotel
相关产品推荐
相关产品推荐

