设计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
(..);

纹理颠簸也很昂贵,因此请始终按纹理然后按状态向量对渲染调用进行排序,以优化性能。

如果使用ES 3.0或ES 3.1,请使用采样器对象将纹理采样状态与纹理对象分开。 这节省了硬件需要花费时间为着色器采样器触摸的每个纹理分别配置纹理单元的时间。

如果应用程序在OpenGL ES 3.1上下文上运行,请考虑使用顶点属性绑定。 这些将通用顶点属性数组状态分为两个单独的实体:

  • 顶点缓冲区绑定点的数组,其中每个绑定点保存有关以下内容的信息:
    1.绑定缓冲区对象
    2.开始偏移
    3.大步走
  • 通用顶点属性格式信息记录的数组,其中每个记录指定:
    1.组件数
    2.归一化标志状态
    3.要获取的第一个元素相对于顶点缓冲区绑定特定属性的偏移量
    4.参考上述新的顶点缓冲区绑定点之一

与完全重新定义通用顶点属性数组配置相比,重用相同的顶点缓冲区绑定点以用于多个属性,或者通过切换到不同的顶点缓冲区绑定点来修改通用顶点属性数组的数据源,将是一种更轻量级的操作。 使用glVertexAttribPointer()调用。

6.4.9 尽量减少draw calls

OpenGL ES需要执行各种不同的任务,才能执行单个绘制调用,例如。:

  • 必须验证帧缓冲区的完整性
  • 必须识别出不完整的纹理
  • 处理当前绑定的顶点数组对象
  • 如果启用了客户端顶点属性数组,则需要将数据传输到GPU可访问的内存区域

在OpenGL ES 3.0中,始终考虑使用不可变纹理。 这些总是完整的,因此可以跳过昂贵的验证过程。

在OpenGL ES 3.1中,如果发出了间接绘图调用,则可以将验证过程的某些部分移到硬件上。

在Android下,每次从Java调用本机代码实现都会带来一笔额外的费用,而这些费用很快就会加起来。

由于这些原因,建议使发出的绘制调用的数量保持最少,并减少进入渲染管线的顶点数量。 后者可以通过使用三角带描述几何形状来实现,这有助于减少硬件需要处理的数据量。 从OpenGL ES 3.0开始,可以使用原始的重新启动功能通过一次绘制调用来渲染不相交的条。

6.4.10 缩放分辨率

应在实际设备上测试目标分辨率和帧速率的不同值,权衡视觉保真度与产生的性能预算。 显示器的物理分辨率决定了理想的帧缓冲区分辨率。

使用帧缓冲区对象以较小的分辨率渲染场景的各个部分。 然后,在无论如何都可能发生的后期处理过程中,可以将场景放大到显示器的原始分辨率。 UI和HUD元素然后可以以本机分辨率呈现。

在前几代和当前几代的主机游戏中,这种方法都并不罕见。 由于纹理过滤器硬件可以平滑图像,因此它提供了选择较低分辨率的灵活性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值