可怜的皮格勒表演家

2024-09-29 01:34:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在考虑将一个项目从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。在


Tags: informaindefdisplaywindow事情la
3条回答

除了使用batches之外,在导入pyglet之后,我通过禁用debug_gl获得了显著的性能提升(在某些机器上):

import pyglet
pyglet.options['debug_gl'] = False

将代码重新构造为类有助于提高计算机的性能。即使没有批处理图形调用,它也可以绘制100个标签。我不知道为什么这会提高性能(它只是删除了装饰器)。在

import pyglet

class GameWindow(pyglet.window.Window):
    def __init__(self, *args, **kwargs):
        super(GameWindow, self).__init__(*args, **kwargs)
        pyglet.clock.schedule_interval(self.update, 1.0/60.0)
        self.labelList = []
        self.fps_display = pyglet.clock.ClockDisplay()
        self.labelBatch = pyglet.graphics.Batch()
        for i in range(1000):
            label = pyglet.text.Label('Hello, world',
            font_name='Times New Roman',
            font_size=36,
            x=self.width//2, y=self.height//2+i,
            anchor_x='center', anchor_y='center',
            batch = self.labelBatch)
            self.labelList.append(label)

    def update(self, dt):
        for la in self.labelList:
            la.x += 1

    def on_draw(self):
        self.clear()
        self.labelBatch.draw()
        self.fps_display.draw()

if __name__ == "__main__":
    game = GameWindow(width=800, height=600)
    pyglet.app.run()

考虑使用Batch同时绘制所有标签:

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()

虽然您的示例运行时的fps比我机器上的目标30要少一些,但是这个增强使它能够以大约60 fps的速度运行。尝试增加通过schedule_interval(update,...)指定的update()调用的频率,以找出可以达到的帧速率。在

另一件事是,对标签的x成员的每次赋值都会导致其_update()方法被调用,这似乎每次都会从头开始重新构建标签文本内容的可视化表示。因此,可以通过继承Label类并重写其_set_x()方法来抑制那些_update()调用(参见this question关于Sprite类的相应行为)。在

相关问题 更多 >