Python 更多Pyglet-Suppress鼠标运动事件?
在和上次一样的游戏中,我遇到了一个新问题。当我移动鼠标时,FPS从60左右增加到500以上。我知道你在想什么;这并不是因为每次事件(我想)都会触发Python 更多Pyglet-Suppress鼠标运动事件?,python,events,pyglet,Python,Events,Pyglet,在和上次一样的游戏中,我遇到了一个新问题。当我移动鼠标时,FPS从60左右增加到500以上。我知道你在想什么;这并不是因为每次事件(我想)都会触发on_draw(),因为我已经覆盖了pyglet.app.EventLoop.idle: class EventLoop: def idle(self): pyglet.clock.tick(poll=True) return pyglet.clock.get_sleep_time(sleep_idle=True
on_draw()
,因为我已经覆盖了pyglet.app.EventLoop.idle
:
class EventLoop:
def idle(self):
pyglet.clock.tick(poll=True)
return pyglet.clock.get_sleep_time(sleep_idle=True)
pyglet.app.EventLoop = EventLoop()
另外,我在绘图函数的窗口上调用flip()
。所有无用的鼠标移动事件都会占用大量CPU,这很烦人。我能怎么办
编辑
我在绘图函数中添加了window.invalid=False
,在更新函数中添加了window.invalid=True
,这似乎减少了其他鼠标操作的CPU使用
编辑2
绘图功能是一个典型的on_draw()
功能
编辑3
经过进一步的调查,似乎所有这些事件都不像我想象的那样占用了那么多CPU。不过,最好知道这是Pyglet应该采取的行动方式,还是应该避免这种情况。鼠标事件的所有操作都是更新应用程序的输入控件状态模型,并在下次定期更新和重新显示world模型时使用它(这在物理、渲染等方面可能要复杂得多) ie仅仅因为鼠标事件以300fps的速度出现并不意味着你必须以300fps的速度完成所有你想做的事情 我已经有一段时间没有做任何Pyglet了,但我似乎使用的模式是将Pyglet的
window.window
子类化为MyGameWindow
,然后注册事件处理程序,如
@self.event
def on_mouse_motion(x,y,dx,dy):
self.mouse_position=(x,y)
self.mouse_buttons=0
self.invalid = False
(还有鼠标拖动时的
、鼠标按下时的、鼠标释放时的)。嗯……事实上,我认为分配给self.invalid
可能对于覆盖Pyglet的默认行为以及将任何进一步的更新/绘图推迟到下一个“时钟滴答”是至关重要的.鼠标事件中你应该做的就是更新你的应用程序的输入控制状态模型,并在下一次定期更新和重新显示世界模型时使用该模型(这可能在物理、渲染和其他方面要复杂得多)
ie仅仅因为鼠标事件以300fps的速度出现并不意味着你必须以300fps的速度完成所有你想做的事情
我已经有一段时间没有做任何Pyglet了,但我似乎使用的模式是将Pyglet的window.window
子类化为MyGameWindow
,然后注册事件处理程序,如
@self.event
def on_mouse_motion(x,y,dx,dy):
self.mouse_position=(x,y)
self.mouse_buttons=0
self.invalid = False
(还有鼠标拖动时的、鼠标按下时的、鼠标释放时的)。嗯……事实上,我认为分配给self.invalid
可能对于覆盖Pyglet的默认行为以及将任何进一步的更新/绘图推迟到下一个“时钟滴答”是至关重要的.可能重复的I既执行计划间隔
又执行设置fps\u限制
,游戏在没有事件的情况下以60-80 fps的速度运行。可能重复的I既执行计划间隔
又执行设置fps\u限制
,游戏在没有事件的情况下以60-80 fps的速度运行。这是我现在所做的另一个解决方案,似乎没有如果您在鼠标运动事件中或在绘图()上的中设置了self.invalid=False,那么这很重要
。一旦你想重新绘制屏幕,例如在更新功能中,你必须将其设置为True
。此外,鼠标事件仍然会触发时钟滴答声,因此ClockDisplay
的FPS计数器会出问题。这是我现在所做的另一个解决方案,如果你设置self.invalid=False或在绘图()上的中取消>。
一旦您希望重新绘制屏幕,例如在更新功能中,您必须将其设置为True
。此外,鼠标事件仍会触发时钟滴答声,因此时钟显示
的FPS计数器会发疯。