更多 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)
pyglet.app.EventLoop = EventLoop()

此外,我在绘图函数中对窗口调用flip()。所有无用的鼠标运动事件都会占用大量CPU,这很烦人。我能做些什么呢?

编辑

我在绘图功能中添加了window.invalid = False,并在更新功能中添加了window.invalid = True,这似乎减少了其他鼠标操作的 CPU 使用率。

编辑 2

绘图功能是典型的on_draw()功能。

编辑 3

经过更多的调查,似乎所有这些事件都没有像我想象的那样占用那么多的CPU。不过,最好知道这是否是Pyglet应该采取的行为方式,或者是否应该避免。

在鼠标事件上,你应该做的只是更新应用的输入控件状态模型,并在下一次定期计划更新和重新显示世界模型时使用它(这可能在物理和渲染等方面要复杂得多)。

即仅仅因为鼠标事件以 ~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

(也on_mouse_dragon_mouse_presson_mouse_release)。 嗯......实际上,我认为分配给 self.invalid 对于覆盖 Pyglet 的默认行为并将任何进一步的更新/绘制推迟到下一个"时钟滴答声"可能至关重要。

最新更新