首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pyglet性能差

Pyglet性能差
EN

Stack Overflow用户
提问于 2014-02-05 09:50:25
回答 3查看 1.8K关注 0票数 0

我正在考虑将一个项目从PySFML移植到Pyglet。SFML是一个有点不可靠的库,尽管它运行得很好,但我想我应该看看Pyglet。不幸的是,Pyglet在做简单的事情时会显示不稳定的FPS变化(在20到800 FPS之间),而当我尝试做更花哨的事情时,Pyglet几乎无法绘制帧。

代码语言:javascript
复制
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个标签,然后在屏幕上移动它们。在我的机器上,这个速度大约是7fps。使用SFML,绘制500个精灵并处理输入,我得到了200左右的FPS。

EN

回答 3

Stack Overflow用户

发布于 2014-02-06 03:01:52

考虑使用Batch一次绘制所有标签:

代码语言:javascript
复制
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_interval(update,...)指定的update()调用的频率,以了解您可以达到的帧率。

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

票数 2
EN

Stack Overflow用户

发布于 2014-02-11 01:05:30

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

代码语言:javascript
复制
import pyglet
pyglet.options['debug_gl'] = False
票数 2
EN

Stack Overflow用户

发布于 2014-02-11 00:05:22

将代码重组为一个类有助于提高我计算机上的性能。即使没有批处理图形调用,它也可以绘制100个标签。我不确定为什么这会提高性能(它只是去掉了装饰器)。

代码语言:javascript
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21567191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档