pyopengl中圆形物体的速度问题

时间:2019-01-09 16:20:30

标签: python python-3.x 3d pygame pyopengl

我最近使用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()

1 个答案:

答案 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 BuffersVertex Array Objects 进一步改进。
Pygame OpenGL 3D Cube Lag