Python 派格勒:我怎样才能在需要的时候调用draw?

Python 派格勒:我怎样才能在需要的时候调用draw?,python,optimization,draw,pyglet,event-loop,Python,Optimization,Draw,Pyglet,Event Loop,我有两个进程通过队列进行通信。一个是更改应用程序状态,另一个是运行pyglet事件循环。(只是附带说明,这可能不是一个多处理问题)。我只想在状态发生变化或中间可能有插值步数时绘制 我对两件事感到困惑 如果状态已更改,我可以编写自己的事件循环并在那里签入。然而,即使是文档中最小的应用程序,其性能也远远低于默认的app.run()。为什么呢 这是文档中的循环: 为True时: pyglet.clock.tick() 对于pyglet.app.windows中的窗口: 窗口。将_切换到() windo

我有两个进程通过队列进行通信。一个是更改应用程序状态,另一个是运行pyglet事件循环。(只是附带说明,这可能不是一个多处理问题)。我只想在状态发生变化或中间可能有插值步数时绘制

我对两件事感到困惑

  • 如果状态已更改,我可以编写自己的事件循环并在那里签入。然而,即使是文档中最小的应用程序,其性能也远远低于默认的app.run()。为什么呢
  • 这是文档中的循环:

    为True时:
    pyglet.clock.tick()
    对于pyglet.app.windows中的窗口:
    窗口。将_切换到()
    window.dispatch_events()
    window.dispatch\u事件('on\u draw')
    window.flip()
    
  • 如果我使用app.run()(出于上述性能原因)并检查on_draw()中的状态变化,那么我会在帧之间看到奇怪的口吃图像。看起来窗口在多个帧之间来回变化,而我没有画任何东西。为什么?
  • 我的on_draw()看起来像这样:

    def on_draw(自):
    if self.check_if_state_change():
    self.draw__新状态()
    
    我知道我可以像这样防止口吃:

    def on_draw(自):
    if self.check_if_state_change():
    self.draw__新状态()
    其他:
    self.再画一次旧的状态()
    
    但我不想这样做,因为重新绘制旧状态需要时间,而性能对于此应用程序至关重要

  • 我没有发现为什么最小循环比app.run()慢,但文档似乎自相矛盾。更改事件循环的建议方法实际上是将app.EventLoop子类化并重写idle()方法
  • 口吃是由于窗口被双缓冲,这可能是更好的
  • 我对这两个问题的解决方案是这样的,它将尽可能快地反复调用_draw():

    class CustomLoop(app.EventLoop):
    def怠速(自):
    dt=自时钟更新时间()
    self.clock.call_调度函数(dt)
    #重新绘制所有窗口
    对于app.windows中的窗口:
    窗口。将_切换到()
    window.dispatch\u事件('on\u draw')
    window.flip()
    窗口。\u legacy\u invalid=False
    #无超时(空闲()调用之间的睡眠时间)
    返回0
    app.event_loop=CustomLoop()
    app.run()#锁定线程
    
    我认为他们的文档应该添加一个更改事件循环的最佳实践示例