我在图形应用程序上使用pygame,涉及一些视频计算和鼠标事件监听。我正在使用树莓3,raspbian jessie和python2.7。
正如标题所说:我正在丢失一些鼠标事件,特别是当CPU负载很高时。我设法在这个小例子中重现了这种行为:
import pygame
import time
pygame.init()
pygame.display.set_caption('Crash!')
window = pygame.display.set_mode((300, 300))
running = True
Rectplace = pygame.draw.rect(window, (255, 0, 0),(100, 100, 100, 100))
pygame.display.update()
while running:
time.sleep(0.1)
for event in pygame.event.get():
print(`event`)
if event.type == pygame.QUIT:
running = False
运行此脚本时,大多数鼠标滚轮事件(按钮4和5)在快速滚动时被丢弃。删除模拟CPU负载的time.sleep(0.1)
,使事件监听器完全可靠。
由于我无法移除缓慢的计算部分,也没有更多地优化它,我该怎么做才能找回这些事件?
感谢您分享您的大脑!
答案 0 :(得分:1)
我的猜测是pygame使用有限大小的循环事件队列。完成后,每个新事件都会替换最旧的事件。如果你得到的事件多于你所能处理的事件,那就放手吧,因为你无论如何都要丢弃它们。
如果你有偶发的慢速计算,那么追赶可能是可行的,那么你必须将计算分解成足够短的时间,以便在默认队列满之前获取事件。获得它们时,要么立即处理,要么放入更大的catch_up队列。最好的方法取决于代码的细节。
或者调查建议的线程解决方案。