在python的OpenGL环境下搭了一个简易的加载gltf动画的框架。测试的时候发现渲染很耗时,做了一些零碎的优化,现在的速度还算令人满意。印象比较深的一个优化是针对joint matrix的数据传输方式的改变,在此做个记录。
优化之前
之前因为骨骼关节数量超过了单个shader支持的uniform,所以把骨骼部分的数据改成了UBO(TODO:UBO相关博客)。
按理这一堆joint matrices和joint normal matrices是可以打包一块传上去,只传一次,这样效率会高很多。
如果用c++写,可以先开一块连续内存,然后每次更新这块内存,再一次打包传给ubo就行。但不知道python要怎么处理,所以一开始写成了这种扣扣搜搜的方式。
class Skin:
def __init__(self, skin: GLTFSkin):
...
def update_ubo(self):
glBindBuffer(GL_UNIFORM_BUFFER, self.ubo_id)
# 逐个更新joint matrix
for i, m in enumerate(self.joint_matrices):
glBufferSubData(GL_UNIFORM_BUFFER, i * glm.sizeof(glm.mat4), glm.sizeof(glm.mat4), glm.value_ptr(m))
offset = len(self.joint_matrices)
# 逐个更新joint normal matrix
for i