尝试的优化渲染速度的方法

Posted by shensunbo on January 9, 2026

使用perf等工具看一下火焰图,检查一下时间都去哪了👀

FlameGraph

减少uniform更新次数

使用UBO将多个uniform打包,并绑定到相应的mesh上,比如材质属性和纹理加载状态

TODO:会增加GPU内存开销,没具体验证过实际影响,也不一定是最佳实践 🤷‍♂️

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
layout (std140) uniform MaterialBlock {
    vec4 materialDiffuseColor;
    vec4 materialSpecularColor;
    float Opacity;
    float Shininess;
    float ShininessStrength;
    bool texture_diffuse_load;
    bool texture_specular_load;
    bool texture_normal_load;
    bool texture_ao_load;
    bool texture_alpha_load;
    bool texture_roughness_load;
    bool texture_metallic_load;
    bool texture_emissive_load;
} material;

去重,能不更新就不更新

通过一定的逻辑和判断等等,减少不必要的uniform更新,比如在控制车门旋转的时候,这个车门的部件是可以共享一组uniform的,不需要为每个部件都更新一次设置。

png格式的纹理加载速度慢,使用其他GPU友好的格式

TODO:还没尝试过

能在顶点着色器完成的计算就不要放到片段着色器

能在CPU完成的计算就不要放到GPU,比如MVP矩阵的计算