1

在与上次相同的游戏中,我遇到了一个新问题。当我移动鼠标时,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 应该采取的行动方式,或者是否应该避免这种方式。

4

1 回答 1

1

你应该对鼠标事件做的就是更新你的应用程序的输入控制状态模型,并在下一次定期更新和重新显示世界模型时使用它(这对于物理和渲染等东西可能要复杂得多)。

即仅仅因为鼠标事件以~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_drag, on_mouse_press, on_mouse_release)。嗯...实际上,我认为分配到self.invalid可能对于覆盖 Pyglet 的默认行为并将任何进一步的更新/绘图推迟到下一个“时钟滴答”时至关重要。

于 2012-09-17T09:29:06.357 回答