为什么这个pyglet基本程序会变慢

时间:2015-01-06 09:31:16

标签: performance python-3.4 frame-rate pyglet

我目前在使用pygame一段时间之后在python 3.4之上使用了pyglet 1.2alpha1。在pygame中,让主循环尽可能快地运行是微不足道的,它提供了一种清晰的基准测试变化方式,并记录了fps下降。我的目标不是自己构建一个游戏,而是模拟游戏,它运行得越快,我就越快乐。

我很难弄清楚如何以相同的方式设置pyglet的帧速率。我知道我需要停用窗口的默认vsync选项并删除默认的fps上限,但这并不能解决问题。设置帧率松散的实际尝试在较低的问题代码中描述,该代码失败(上限为60 fps)。

另外,几秒钟之后,该程序将速度降低到难以承受的速度,即使它的工作负荷根本没有变化。我发现调用update_true_fps是罪魁祸首,虽然我不明白为什么:如果它最初可以以60 fps运行,为什么它应该在半分钟后以2 fps运行?

有问题的代码:

import pyglet
from pyglet.window import key

class Pyg:
    def __init__(self):
        self.window = pyglet.window.Window()
        self.fps = 0
        pyglet.clock.set_fps_limit(0)
        self.window.set_vsync(False)
        pyglet.clock.schedule(self.tick)
        self.update_true_fps(1)
        fps_display = pyglet.clock.ClockDisplay()

        @self.window.event
        def on_draw():
            self.window.clear()
            fps_display.draw()
            self.fps_label.draw()

    def tick(self,dt):
        if dt != 0:
            self.fps = 1.0/dt
        self.update_true_fps()

    def update_true_fps(self):
        self.fps_label = pyglet.text.Label(text="FPS:"+str(self.fps),x=self.window.width//2,\
            y=20, anchor_x='center')

    def run(self):
        pyglet.app.run()

a = Pyg()
a.run()

1 个答案:

答案 0 :(得分:0)

它很慢的一个原因是你生成了太多的Label对象。标签在Pyglet中没有得到很好的优化,并且涉及许多通常很慢的操作。而不是每个刻度创建一个标签,只在绘制时生成一个标签,或者更好的是,缓存对象并在fps更改时更改文本。您还可以将值记录到控制台,从而绕过昂贵的图形操作。至于随着时间的推移逐渐减慢,它可能是一个pyglet bug,内存泄漏等。如果你不创建这么多标签,你就不应该遇到这种情况。