Python Pyglet性能差
我正在考虑将一个项目从PySFML移植到Pyglet。SFML是一个有点不可靠的库,即使它运行得足够体面,我还是想看看Pyglet。不幸的是,Pyglet在做简单的事情时显示不稳定的FPS变化(20到800 FPS之间),当我尝试做更喜欢的事情时,几乎无法绘制帧Python Pyglet性能差,python,sfml,pyglet,Python,Sfml,Pyglet,我正在考虑将一个项目从PySFML移植到Pyglet。SFML是一个有点不可靠的库,即使它运行得足够体面,我还是想看看Pyglet。不幸的是,Pyglet在做简单的事情时显示不稳定的FPS变化(20到800 FPS之间),当我尝试做更喜欢的事情时,几乎无法绘制帧 import pyglet window = pyglet.window.Window() fps_display = pyglet.clock.ClockDisplay() labelList = [] for i in range
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 fps的速度运行。使用SFML,绘制500个精灵并处理输入时,我的速度为200磅/秒。考虑使用a一次绘制所有标签:
lbls = pyglet.graphics.Batch()
for i in range(100):
label = pyglet.text.Label('Hello, world',
font_name='Times New Roman', [...], batch=lbls)
labelList.append(label)
[...]
lbls.draw()
虽然您的示例在我的机器上的运行速度比您的目标速度低30 fps,但此增强功能使其能够以~60 fps的速度运行。尝试增加通过schedule\u interval(update,…)
指定的update()
调用频率,以了解您可以实现的帧速率
另一件事是,对标签的x
成员的每个赋值都会导致调用其\u update()
方法,这似乎每次都会完全从头开始重新构建标签文本内容的视觉表示。因此,通过继承标签
类并覆盖其\u set\u x()
方法以抑制那些\u update()
调用,可以想象到一些性能增益(请参阅关于精灵
类的相应行为) 考虑使用a一次绘制所有标签:
lbls = pyglet.graphics.Batch()
for i in range(100):
label = pyglet.text.Label('Hello, world',
font_name='Times New Roman', [...], batch=lbls)
labelList.append(label)
[...]
lbls.draw()
虽然您的示例在我的机器上的运行速度比您的目标速度低30 fps,但此增强功能使其能够以~60 fps的速度运行。尝试增加通过schedule\u interval(update,…)
指定的update()
调用频率,以了解您可以实现的帧速率
另一件事是,对标签的
x
成员的每个赋值都会导致调用其\u update()
方法,这似乎每次都会完全从头开始重新构建标签文本内容的视觉表示。因此,通过继承标签
类并覆盖其\u set\u x()
方法以抑制那些\u update()
调用,可以想象到一些性能增益(请参阅关于精灵
类的相应行为) 将代码重组为类有助于提高我的计算机性能。即使没有批处理图形调用,它也可以绘制100个标签。我不确定这为什么会提高性能(它只是删除了装饰器)
将代码重组为类有助于提高计算机的性能。即使没有批处理图形调用,它也可以绘制100个标签。我不确定这为什么会提高性能(它只是删除了装饰器) 除了使用,我还通过在导入pyglet后立即禁用,获得了显著的性能提升(在某些机器上):
import pyglet
pyglet.options['debug_gl'] = False
除了使用,我还通过在导入pyglet后立即禁用,获得了显著的性能提升(在某些机器上):
import pyglet
pyglet.options['debug_gl'] = False
谢谢你的建议,J。我仍然相信这里还有更深层次的问题。即使是一个在屏幕上移动一个精灵的非常基本的程序也不能达到60 FPS。在这种状态下,Pyglet显然无法使用。嗯…谢谢你的建议,J。我仍然相信这里有更深层次的问题。即使是一个在屏幕上移动一个精灵的非常基本的程序也不能达到60 FPS。在这种状态下,Pyglet显然无法使用。隐马尔可夫模型。。。