Python中mss库启用多进程仍仅能捕获60FPS问题排查
问题原因分析及解决思路
核心瓶颈:系统屏幕捕获的机制限制
- 你的主显示器是60Hz,Windows系统的桌面帧缓冲区刷新频率会和主显示器同步。mss在Windows默认使用GDI捕获,这种方式是从系统桌面帧缓冲区读取数据,而缓冲区每秒仅更新60次——不管开多少进程,所有进程都在读取同一个缓冲区的帧,所以总捕获帧率永远突破不了60FPS。
- 捕获区域大小不影响帧率,因为GDI本质是读取整个帧缓冲区后再裁剪,核心还是受限于缓冲区的刷新频率。
代码中的低效点(非核心原因)
你的测试代码里,每次循环都创建mss.mss()实例,这会重复初始化捕获上下文,增加不必要的开销。优化方式是把mss实例放在循环外:
def task(): start = time.time() with mss.mss() as sct: for x in range(600): sct.grab({'mon': 1, 'top': 690, 'left': 750, 'width': 450, 'height': 50}) print(time.time() - start)
突破60FPS的可行方案
- 切换捕获后端:mss支持DirectX后端(需安装
mss[directx]),DirectX捕获可以绕过GDI的限制,直接从显卡帧缓冲区读取,能匹配你的144Hz屏幕刷新频率。 - 优化多进程架构:多进程捕获同一个屏幕会导致资源竞争,反而降低单进程效率。建议用单进程负责捕获,把帧数据丢给多进程做图像处理,实现捕获与计算分离,既利用多进程算力,又不浪费捕获资源。
验证步骤
- 先切换DirectX后端测试:
安装依赖:pip install mss[directx]
代码中指定后端:with mss.mss(display="directx") as sct: # 执行捕获逻辑 - 测试单进程捕获帧率,确认是否能突破60FPS;如果可行,再搭建单进程捕获+多进程处理的架构优化整体流程。
内容的提问来源于stack exchange,提问作者BappoHotel
相关产品推荐
相关产品推荐

