使用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
相关产品推荐
相关产品推荐

