【问题标题】:Manual pyglet loop freezes after a few iterations几次迭代后手动 pyglet 循环冻结
【发布时间】:2024-01-10 07:08:01
【问题描述】:

我正在测试 pyglet 以在更大的项目中使用,显然 pyglet 建议/希望您使用它自己的循环(使用 pyglet.app.run())

这是我不想要的,因为其他包的兼容性以及不必重写整个程序结构。

在这里,我将来自不同部分、教程和文档的原型代码组合在一起。 它运行 5-15 次迭代,然后只是冻结,不打印任何内容,也不进行任何绘图更新。

from __future__ import division, print_function

import sys

import pyglet

window = pyglet.window.Window(800, 800, resizable=True)
window.set_caption('Pyglet Testing')
window.flip()

image = pyglet.resource.image('Sprites/scout.png')

def draw(dt):
    image.blit(700-dt, 400)

while not window.has_exit:
    dt = pyglet.clock.tick()
    window.dispatch_events()
    window.clear()
    draw(dt)
    window.flip()
    print(dt)

我的怀疑是我没有做任何事情来捕获事件并处理它们,所以在某个时候它只是溢出了事件并阻塞了整个事情。但是我不明白如何做到这一点,并且在不到 1 秒的时间内被事件淹没似乎有点多。

有什么帮助吗?

【问题讨论】:

    标签: python rendering game-engine pyglet


    【解决方案1】:

    基本上你正在做的是将尽可能多的 image.blit(...) 命令发送到窗口,直到电脑可能无法再处理它。

    例如,如果您像这样更改代码:

    添加此代码:

    import time  
    from time import sleep  
    

    更改代码:

        def draw(dt):    
            image.blit(700-dt, 400)  
            sleep(0.1)             #insert this line  
    

    在执行修改后的代码时,你会注意到它并没有冻结,并且输出的 dt 大约是 0.11 秒,即自上次“滴答”以来的秒数 = 睡眠时间(0.1 秒)+ 余数时间(清除窗口,显示新框架...)

    【讨论】: