python - 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()
解决方案
改进的第一步是使用固定的功能属性。初始化时,首先创建一个带有顶点属性的数组:
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 立方体滞后。
推荐阅读
- wordpress - Autofill with LinkedIn form
- php - how to turn this function to be recursive with multiple dimensional array?
- java - 是否有用于访问 power bi 报告的 java sdk?
- java - Java:使用可比较类时找不到对象
- python - 当索引包含不同数量的 NULL 值时,在 matplotlib 中拟合条形宽度
- python-3.x - Selenium 浏览器给了我一个例外,即在不使用 WebDriver 的情况下不能滚动到视图中的元素
- vb.net - 插入数据库时出现数据不匹配错误
- python-3.x - 为什么 Python 不能识别我导入的模块或我创建的字典?
- scala - 在 Akka Streams 中将 Sink 转换为图形(SinkShape)?
- javascript - 静态对象的键顺序