手动侏儒循环在几次迭代后冻结

2022-04-16 00:00:00 python game-engine rendering pyglet

问题描述

我正在测试在一个更大的项目中使用的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秒的时间里被事件淹没似乎有点太多了。

有帮助吗?


解决方案

基本上您正在做的是发送尽可能多的图像。blit(...)命令发送到窗口,直到PC可能无法再处理它。

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

添加此代码:

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秒)+剩余时间(清除窗口,显示新帧...)

相关文章