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