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

使用pygame.midi时CPU占用达20%-25%,求优化解决思路

pygame.midi循环CPU占用过高解决方案

你遇到的CPU占用过高问题确实来自空转的while循环:当前循环没有任何休眠限制,会以最高频率反复执行轮询逻辑,即使没有任何事件需要处理也会持续占用CPU资源。

可落地的解决思路

  • 方案1:使用pygame内置时钟限制帧率
    这是最适配pygame生态的方案,仅需要新增2行代码即可将CPU占用降到1%以下,同时完全不影响输入响应速度。
    首先在循环外初始化时钟对象:
    clock = pg.time.Clock()
    然后在while循环的最后一行添加帧率限制代码,限制为60帧即可满足所有常规输入场景的响应需求:
    clock.tick(60)

  • 方案2:添加短时间休眠
    如果不需要用到pygame的其他渲染逻辑,也可以用time模块的休眠功能,给空轮询增加1毫秒的休眠间隔,对MIDI输入的延迟影响完全不可感知,但能大幅降低CPU占用。
    在循环顶部导入time模块后,在while循环最后一行添加:
    time.sleep(0.001)

  • 方案3:优化MIDI事件处理逻辑
    如果上述两种方案还是不能满足超低延迟的需求,可以尝试调整MIDI轮询的触发逻辑:只有当pygame事件队列清空后再检查MIDI输入,避免不必要的重复轮询。

修改后的完整代码示例

import time
import pygame as pg
import pygame.midi

# 初始化、对象定义部分省略
going = True
clock = pg.time.Clock() # 新增时钟对象
while going:
    events = event_get()
    for e in events:
        if e.type in [pg.QUIT]:
            going = False
        if e.type in [pg.KEYDOWN]:
            going = False
        if e.type in [pygame.midi.MIDIIN]:
            if e.data2 == 127:
                shortcuts(e.data1)

    if i.poll():
        midi_events = i.read(10)
        # convert them into pygame events.
        midi_evs = pygame.midi.midis2events(midi_events, i.device_id)

        for m_e in midi_evs:
            event_post(m_e)
    
    clock.tick(60) # 新增帧率限制,也可替换为 time.sleep(0.001)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 11:18:01