在上次的同一场比赛中,我遇到了一个新问题。当我移动鼠标时,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应该采取的行动,还是应该避免的事情,这仍然是一件好事。
答案 0 :(得分: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的默认行为以及推迟任何进一步的更新/绘制直到下一个“时钟滴答”至关重要。