Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 更多Pyglet-Suppress鼠标运动事件?_Python_Events_Pyglet - Fatal编程技术网

Python 更多Pyglet-Suppress鼠标运动事件?

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

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

鼠标事件的所有操作都是更新应用程序的输入控件状态模型,并在下次定期更新和重新显示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计数器会发疯。