我最近使用pygame和pyopengl在python 3中构建了一个obj文件加载器。它工作得很好,但是当我加载一个圆形对象时,它开始运行起来确实很慢。我想以适当的帧速率加载多个复杂的对象,但是这种方法不适合这样做。您是否有任何建议可以更有效地编写代码,将pygame / pyopengl换成其他东西,或者(如果上述工作都不行)对对象进行下采样? (代码的重要部分在下面)
# verticies is a list of all verticies
# surfaces holds tuples of indexes of verticies
def body():
glBegin(GL_TRIANGLES)
for surface in surfaces:
for vertex in surface:
glVertex3fv(vertices[vertex])
glEnd()
pygame.init()
size = (800,600)
pygame.display.set_mode(size, DOUBLEBUF|OPENGL)
while True:
body()
答案 0 :(得分:0)
改进的第一步是使用固定的功能属性。初始化时,首先创建一个带有顶点属性的数组:
vertex_list = []
for surface in surfaces:
for vertex in surface:
vertex_list += vertices[vertex]
vertex_array = (GLfloat * len(vertex_array))(*vertex_array)
no_of_vertices = len(vertex_list) // 3
每次绘制几何图形时都使用顶点数组。使用 glVertexPointer
定义顶点数据数组。使用 glEnableClientState
/glDisableClientState
启用(或禁用)客户端功能。使用 glDrawArrays
绘制几何图形:
def body():
glVertexPointer(3, GL_FLOAT, 0, vertex_array)
glEnableClientState(GL_VERTEX_ARRAY)
glDrawArrays(GL_TRIANGLES, 0, no_of_vertices)
glDisableClientState(GL_VERTEX_ARRAY)
pygame.init()
size = (800,600)
pygame.display.set_mode(size, DOUBLEBUF|OPENGL)
while True:
body()
这可以通过 Vertex Buffers 和 Vertex Array Objects 进一步改进。
见Pygame OpenGL 3D Cube Lag。