- 优化shader提升性能
- 复杂运算,如果能在c++代码里方便计算出来,就移到C++代码里计算,然后通过uniform传给shader
- 锐化/双边滤波等效果,可能会用到固定长度的坐标数组,这样的数组可以在顶点着色器里计算,然后通过varying参数传到Fragment着色器。因为一般情况下,顶点着色器执行的次数远远少片段着色器,所以这样做能节省性能
- 二维模糊卷积核请用先x后y,二次渲染的方式:Android图像处理 - 高斯模糊的原理及实现
- 计算量较多的fragment shader, 在不影响效果的情况下,尽量用mediump精度,以提高性能;顶点着色器一般用highp精度
- 减少 if else的分支: 如何在shader中避免使用if else
- 在可效果可接受的前提下,减少循环次数,减少计算量,减少冗余代码。比如跟透明度无关的效果,就只需要取rgb值来计算
- 提升性能的OpenGL的组件和接口
VAO VBO EBO PBO能减少CPU和GPU的数据传输,大大提高性能
VAO在OpenGL3.0上才能用
OpenGL ES 3.0 新增的实例渲染接口,可以增强粒子动画的表现能力,以及优化传输和绘制的性能:
glVertexAttribDivisor
glDrawArraysInstanced
glBeginTransformFeedback
- 利用GPU架构提升性能
计算向量化
利用GPU可以并行计算的特性,将
c = a1 * b1 + a2 * b2 + a3 * b3 + a4 * b4
改为
c = dot(vec4(a1, a2, a3, a4), vec4(b1,b2,b3,b4));
的形式
内存布局
GLSL里的Martix是以列主序存储,所以vector在左边,右边乘以Martix的好处是提高运算效率:矩阵:行主序、列主序、行向量、列向量
纹理采样时,逐Tile采样的话cache miss的概率会降到最低。如果做不到逐Tile,则采样时尽量用与上一个uv连续和邻近的uv数据
减少纹理占用
在制作模糊类效果时,使用1/2 RT可以利用硬件的双线性过滤来自动实现模糊计算,也大大减少了GPU内存占用和shader的计算量;能通过单通道纹理实现的功能,就不需要RGBA格式的纹理