我正在考虑将一个项目从PySFML移植到Pyglet。SFML是一个有点不可靠的库,尽管它运行得很好,但我想我应该看看Pyglet。不幸的是,Pyglet在做简单的事情时会显示不稳定的FPS变化(在20到800 FPS之间),而当我尝试做更花哨的事情时,Pyglet几乎无法绘制帧。
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。
发布于 2014-02-06 03:01:52
考虑使用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()虽然在我的机器上,您的示例的运行速度比您的目标30低几fps,但是这个增强使它能够以大约60 fps的速度运行。尝试增加通过schedule_interval(update,...)指定的update()调用的频率,以了解您可以达到的帧率。
另一件事是,对标签的x成员的每次赋值都会导致调用它的_update()方法,这似乎每次都会完全从头开始重新构建标签文本内容的可视化表示。因此,通过继承Label类并重写其_set_x()方法以抑制这些_update()调用(有关Sprite类的相应行为,请参阅this question ),可以获得一些性能增益。
发布于 2014-02-11 01:05:30
除了使用batches之外,我还通过在导入pyglet后立即禁用debug_gl获得了显著的性能提升(在某些机器上):
import pyglet
pyglet.options['debug_gl'] = False发布于 2014-02-11 00:05:22
将代码重组为一个类有助于提高我计算机上的性能。即使没有批处理图形调用,它也可以绘制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()https://stackoverflow.com/questions/21567191
复制相似问题