我正在考虑将一个项目从PySFML移植到Pyglet。SFML是一个有点不稳定的库,尽管它运行得很好,我还是想看看Pyglet。不幸的是,Pyglet在做简单的事情时(在20到800 FPS之间)显示出不稳定的FPS变化,当我尝试做一些更华丽的事情时,它几乎无法画出帧。在
import pyglet
window = pyglet.window.Window()
fps_display = pyglet.clock.ClockDisplay()
labelList = []
for i in range(100):
label = pyglet.text.Label('Hello, world',
font_name='Times New Roman',
font_size=36,
x=window.width//2, y=window.height//2+i,
anchor_x='center', anchor_y='center')
labelList.append(label)
def main():
pyglet.clock.schedule_interval(update, 1/30.0)
pyglet.app.run()
def update(dt):
for la in labelList:
la.x += 1
@window.event
def on_draw():
window.clear()
for la in labelList:
la.draw()
fps_display.draw()
if __name__ == "__main__":
main()
这个例子很蠢,但我只取了100个标签并在屏幕上移动它们。在我的机器上它的速度是每秒7帧。使用SFML,绘制500个sprite并处理输入可以得到200ishfps。在
除了使用batches之外,在导入pyglet之后,我通过禁用debug_gl获得了显著的性能提升(在某些机器上):
将代码重新构造为类有助于提高计算机的性能。即使没有批处理图形调用,它也可以绘制100个标签。我不知道为什么这会提高性能(它只是删除了装饰器)。在
考虑使用Batch同时绘制所有标签:
虽然您的示例运行时的fps比我机器上的目标30要少一些,但是这个增强使它能够以大约60 fps的速度运行。尝试增加通过
schedule_interval(update,...)
指定的update()
调用的频率,以找出可以达到的帧速率。在另一件事是,对标签的
x
成员的每次赋值都会导致其_update()
方法被调用,这似乎每次都会从头开始重新构建标签文本内容的可视化表示。因此,可以通过继承Label
类并重写其_set_x()
方法来抑制那些_update()
调用(参见this question关于Sprite
类的相应行为)。在相关问题 更多 >
编程相关推荐