首页 > 解决方案 > 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()

标签: pythonpython-3.x3dpygamepyopengl

解决方案


改进的第一步是使用固定的功能属性。初始化时,首先创建一个带有顶点属性的数组:

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

每次绘制几何图形时都使用顶点数组。用 定义顶点数据数组glVertexPointerglEnableClientState使用/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 立方体滞后


推荐阅读