You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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屏幕刷新频率。
  • 优化多进程架构:多进程捕获同一个屏幕会导致资源竞争,反而降低单进程效率。建议用单进程负责捕获,把帧数据丢给多进程做图像处理,实现捕获与计算分离,既利用多进程算力,又不浪费捕获资源。

验证步骤

  1. 先切换DirectX后端测试:
    安装依赖:pip install mss[directx]
    代码中指定后端:
    with mss.mss(display="directx") as sct:
        # 执行捕获逻辑
    
  2. 测试单进程捕获帧率,确认是否能突破60FPS;如果可行,再搭建单进程捕获+多进程处理的架构优化整体流程。

内容的提问来源于stack exchange,提问作者BappoHotel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 18:55:18