Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pyglet性能差_Python_Sfml_Pyglet - Fatal编程技术网

Python Pyglet性能差

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

我正在考虑将一个项目从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(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显然无法使用。隐马尔可夫模型。。。