Python OpenGL:球体减慢帧速率

Python OpenGL:球体减慢帧速率,python,performance,opengl,pyopengl,opengl-compat,Python,Performance,Opengl,Pyopengl,Opengl Compat,我有一个类,它根据传入的堆栈计数、扇区计数和半径生成一个球体。问题是,每当我绘制球体时,我的帧速率从57-60 fps下降到20 fps 这是我绘制球体的方式: def draw_edges(self): """Draws the sphere's edges""" glPushMatrix() glTranslate(self.position[0], self.position

我有一个类,它根据传入的堆栈计数、扇区计数和半径生成一个球体。问题是,每当我绘制球体时,我的帧速率从57-60 fps下降到20 fps

这是我绘制球体的方式:

    def draw_edges(self):
        """Draws the sphere's edges"""
        glPushMatrix()
        glTranslate(self.position[0], self.position[1], self.position[2])
        glRotate(self.rotation[3],self.rotation[0],self.rotation[1],self.rotation[2])
        glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)
        glBegin(GL_TRIANGLES)
        for edge in self.edges:
            for vertex in edge:
                glVertex3fv(self.vertices[vertex])
        glEnd()
        glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)
        glPopMatrix()

有人知道我如何加快速度吗?

试着摆脱嵌套循环。有关使用和绘制网格的现代方法,请参见


另一种(不推荐使用的)可能性是使用固定的函数属性

命令

void vertexinter(整数大小、枚举类型、大小步长、常量void*指针);
void NormalPointer(枚举类型、sizei步长、常量void*指针);
void ColorPointer(整数大小、枚举类型、大小步长、常量void*指针);
[...]
指定数组的位置和组织,以存储顶点坐标、法线、颜色,[…]通过调用以下命令之一启用或禁用单个数组:

void EnableClientState(枚举数组);
void DisableClientState(枚举数组);
将数组设置为
顶点数组
法线数组
颜色数组
,[…],分别用于顶点、法线、颜色、[…]数组


使用类的构造函数中的顶点属性数据创建列表:

def\uuuu初始化(自):
# [...]
self.vertexArray=[]
对于self.edges中的边:
对于边中的顶点:
self.vertexArray.append(self.vertex[vertex])
使用阵列指定顶点并绘制网格:

def绘制边(自):
“”“绘制球体的边”“”
glPushMatrix()
glTranslate(自位置[0]、自位置[1]、自位置[2])
glRotate(自旋转[3]、自旋转[0]、自旋转[1]、自旋转[2])
glPolygonMode(GLU前、后、GLU线)
glEnableClientState(GL_顶点_数组)
glVertexPointer(3,GL_浮点,0,自顶点阵列)
GLDRAWARRAY(GL_三角形,0,len(自顶点阵列))
glDisableClientState(GL_顶点_数组)
glPolygonMode(GLU前、后、GLU填充)
GLPOP矩阵()
这是使用VBO和VAO实现现代解决方案的第一步(很小)


通过使用以下工具,可以进一步提高性能:

def\uuuu初始化(自):
# [...]
self.vertexArray=[]
对于self.edges中的边:
对于边中的顶点:

self.vertexArray+=self.vertices[vertex]#for循环在Python中可能非常慢。也许有一种方法可以替换这两个for循环。请注意,您使用的是不推荐使用的固定函数管道。虽然您的系统显然支持它,但它可能远未达到最佳状态。你应该考虑移动到一个可编程的基于着色器的替代方案,或者至少显示列表或VBOs。谢谢!这个方法将我的帧速率提高了一倍,达到了每秒40多帧。@User-92谢谢。不客气。使用VBO可以实现进一步的改进。我将扩展答案。请稍等…@User-92我已经扩展了答案。哇,太疯狂了!我现在有70多帧了。我不知道VBOs能把性能提高这么多。多谢各位@User-92诀窍是顶点数组在构造函数中上载到GPU一次。绘制对象时,只需引用阵列
self.vbo
只是一个名称id。