设计OpenGL ES 方针介绍 (2)
6.4 设计高性能的OpenGL ES应用程序
6.4.1 高级照明/阴影
可编程着色器的可用性使得可以将每像素照明应用于任何地方。 为了更有效地使用可用的片段着色器指令,可以使用每个顶点的光照或光照贴图。
同样,可以使用作为原始纹理的一部分或预先烘焙的镜面高光,立方体照明和反射贴图。 假设该应用程序不支持每日时间功能,则可以预烘焙阴影和灯光并将其作为纹理加载。
6.4.2 避免过度修剪
考虑对任何三角形进行细分,这些三角形的面积比给定网格的平均值大得多。 这将有助于避免过多的削波,削波可能成为性能瓶颈。
考虑下面的示例,其中静态房间从722个三角形变为785个三角形。 向整体几何图形添加了更多的三角形,但是由于没有多余的裁剪过大的三角形,因此性能得以改善。
6.4.3 避免不必要的清除操作
Adreno驱动程序通过使用应用程序先前指定的透明颜色值,将覆盖视口的四边形绘制到帧缓冲区中来处理glClear()调用。 清除呼叫以正常像素速率运行。
对于压缩的深度+模板附件(使用GL_DEPTH24_STENCIL8或GL_DEPTH32F_STENCIL8内部格式的附件),应始终清除Z缓冲区和模板缓冲区。 清除深度或模板缓冲区以获取打包附件会降低性能。
避免使用多余的清理,因为它们的成本很高。
为避免不必要的隐式复制操作,请始终在帧开始时清除深度缓冲区。
6.4.4 避免不必要的MakeCurrent调用
不建议在应用程序的每个帧中调用eglMakeCurrent函数。
6.4.5 QTI SIMD / FPU协处理器的使用
Snapdragon CPU内核支持附加的VeNum SIMD / FPU协处理器,其指令性兼容ARM NEON指令集。 可以对该SIMD / FPU单元进行编码,以执行作业,以减轻CPU或顶点着色器的计算负担,例如蒙皮,模拟或物理。 有一个模拟器,用于在PC上进行测试和开发以及示例汇编代码,以及用于在协处理器上初始化和运行作业的代码。
6.4.6 实现多个线程
如今,Snapdragon处理器支持多个CPU内核。 将作业分配给引擎中的多个线程,以利用可以以并行方式物理执行的线程。
6.4.7 实施遮光等级系统
因为在移动平台上缺少像素着色器指令,所以可以实现所谓的着色等级系统,其中,算法可以根据与摄像机之间的距离(例如,摄像机的距离)在三个或五个等级中进行扩展。 相机靠近对象之前,可能不需要在对象上进行详细的阴影处理。 当物体在一定距离处时,可以使用更简单的阴影。
6.4.8 最小化GL状态更改
ES API调用先排队在命令缓冲区中,然后再分派到驱动程序的内核模式部分,然后再分派给GPU。 因此,对于应用程序而言,仅发出真正修改当前渲染上下文配置的那些API调用很重要。
例如,尽管以下调用集不会对渲染过程造成任何损害,但由于帧缓冲区绑定操作昂贵且glBindFramebuffer( )下面的代码段中提供的调用是多余的:
const GLuint fbo_id = 1;
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo_id);
glDrawArrays
(..);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo_id);
glDrawElements
(..);
- 点赞
- 收藏
- 关注作者
评论(0)