如何使用pyglet提高批次的性能?

时间:2010-12-21 22:31:56

标签: python opengl pyglet

我有一些使用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 个答案:

答案 0 :(得分:1)

如果您使用的是CPython,则有一个快捷方式。 Pypy支持pyglet一段时间(http://pypy.org/compat.html)。 切换到Pypy,您可以轻松获得性能提升,而且基本上不需要更改代码。 希望对你有所帮助。

答案 1 :(得分:0)

如果场景是静态的,则应使用显示列表轻松修复。一些供应商通过在内部将它们转换为VBO和glMultiDrawElements()来优化显示列表,因此一些糟糕的10k四边形应该没有问题。它就像四行代码。