如何通过批处理提升pyglet性能?

2 投票
2 回答
858 浏览
提问于 2025-04-16 08:52

我有一些代码是用 pyglet 库来创建一个批处理的。整个场景加载完后大约有 10,000 个四边形。当我运行这个脚本来渲染整个场景时(这个场景是完全静态的),我发现帧率只有 3FPS。之前我用一个原型来做场景渲染时,使用了一些写得很慢、很粗糙的 Python 代码,结果也是在同样的场景下跑到 3FPS。因为 pyglet 的批处理是用 C++ 管理的,所以我总觉得我可能漏掉了什么明显的东西,导致批处理的绘制速度只有 3FPS。

这是我的场景初始化代码:

glViewport(0, 0, width, height)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(60.0, float(width)/height, .1, 10000.)
glMatrixMode(GL_MODELVIEW)
glClearColor(94.0/255.0, 161.0/255.0, 255.0/255.0, 0.5)
glClearDepth(1.0)
glShadeModel(GL_FLAT)
glEnable(GL_DEPTH_TEST)
glDepthFunc(GL_LEQUAL)  
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)
glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)

这是每帧运行来渲染场景的代码:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
glTranslatef(0, 0, -1*self.mapZoomLevel)
glRotatef(self.mapPitch/5, 1, 0, 0)
glRotatef(self.mapRotation, 0, 0, 1)
glTranslatef(self.mapX, self.mapY, 0)
self.mapPrimitive.batch.draw()

2 个回答

1

如果你在用CPython,有一个快捷的方法。Pypy已经支持pyglet一段时间了(http://pypy.org/compat.html)。

如果你换成Pypy,你可以轻松提高性能,而且基本上不需要修改你的代码。

希望这对你有帮助。

0

如果场景是静态的,也就是没有变化的,那么可以很简单地用显示列表来解决。某些厂商会通过把显示列表转换成顶点缓冲对象(VBO)和内部使用glMultiDrawElements()来优化显示列表,所以即使是10,000个简单的四边形也不会有什么问题。而且这只需要大约四行代码。

撰写回答