Unity渲染优化

来源:互联网 发布:业绩数据分析内容 编辑:程序博客网 时间:2024/04/28 01:46

Unity中的优化技术 By:candycat

优化3D图形流水线

Unity3D-图形性能优化:帧调试器

RenderQueue详解

渲染队列 渲染队列的描述 渲染队列的值 Background 这个队列通常被最先渲染。 1000 Geometry 这是默认的渲染队列。它被用于绝大多数对象。不透明几何体使用该队列。 2000 AlphaTest 通道检查的几何体使用该队列。它和Geometry队列不同,对于在所有立体物体绘制后渲染的通道检查的对象,它更有效。 2450 Transparent 该渲染队列在Geometry和AlphaTest队列后被渲染。任何通道混合的(也就是说,那些不写入深度缓存的Shaders)对象使用该队列,例如玻璃和粒子效果。 3000 Overlay 该渲染队列是为覆盖物效果服务的。任何最后被渲染的对象使用该队列,例如镜头光晕。 4000

性能优化的方法

常见瓶颈和检查方法:

  • GPU通常受到填充速率或存储器带宽的限制。
    降低显示分辨率并运行游戏。如果较低的显示分辨率使游戏运行速度更快,则可能会受到GPU上的fillrate的限制。

  • CPU通常受需要渲染的批次数量的限制。
    在“渲染统计”窗口中检查“批次”。正在渲染的批次越多,CPU的成本就越高。

不常见的瓶颈:

GPU有太多的顶点要处理。可接受以确保良好性能的顶点数取决于GPU和顶点着色器的复杂性。一般来说,目标在移动上不超过100,000个顶点。即使有几百万个顶点,PC也能很好地管理,但是通过优化使这个数字保持尽可能低是一个很好的做法。
CPU有太多的顶点要处理。这可能在皮肤网格,布料模拟,粒子或其他游戏对象和网格。如上所述,通常好的做法是保持这个数字尽可能低,而不损害游戏质量。有关如何执行此操作的指导,请参阅下面的CPU优化部分。
如果渲染在GPU或CPU上不是问题,则在其他地方可能会出现问题 - 例如,在脚本或物理中。使用Unity Profiler找到问题。

CPU优化

为了在屏幕上渲染对象,CPU有很多处理工作要做:工作出哪些灯影响该对象,设置着色器和着色器参数,以及发送绘图命令到图形驱动器,然后准备命令发送到显卡。

所有这些“每个对象”的CPU使用是资源密集型的,所以如果你有很多可见对象,它可以加起来。例如,如果你有一千个三角形,如果它们都在一个网格中,而不是每个三角形一个网格(加起来最多1000个网格),它在CPU上容易得多。 GPU上的这两种场景的成本非常相似,但是CPU渲染一千个对象(而不是一个)所做的工作明显更高。

减少可见对象计数。为了减少CPU需要做的工作量:

将接近的对象组合在一起,可以手动或使用Unity的绘制调用批处理。
通过将单独的纹理放入较大的纹理图集,在对象中使用较少的材料。
减少使对象多次呈现的事物(例如反射,阴影和每像素灯)。
将对象组合在一起,以使每个网格至少有几百个三角形,并且对整个网格只使用一个材质。注意,组合不共享材料的两个对象不会给您任何性能提高。需要多种材料的最常见的原因是两个网格不具有相同的纹理;以优化CPU性能,确保您组合的任何对象共享相同的纹理。

当在正向渲染路径中使用许多像素灯时,存在合并对象可能无意义的情况。请参阅下面的照明性能部分,了解如何管理这一点。

GPU:优化模型几何

有两个基本规则用于优化模型的几何:

不要使用任何更多的三角形
尝试保持UV映射接缝和硬边缘(加倍的顶点)的数量尽可能低
请注意,图形硬件必须处理的实际顶点数量通常与3D应用程序报告的数量不同。 建模应用程序通常显示组成模型的不同角点的数量(称为几何顶点计数)。 然而,对于图形卡,一些几何顶点需要被分割成两个或更多个逻辑顶点用于渲染目的。 如果顶点具有多个法线,UV坐标或顶点颜色,则必须拆分顶点。 因此,Unity中的顶点计数通常高于3D应用程序给出的计数。

虽然模型中的几何图形的大多数与GPU相关,但是Unity中的一些功能也会处理CPU上的模型(例如,网格蒙皮)。

GPU:编写高性能着色器的提示

不同的平台具有非常不同的性能能力;高端PC GPU可以处理比低端移动GPU更多的图形和着色器。即使在单个平台上也是如此;快速GPU比慢速集成GPU快十倍。

在移动平台和低端PC上的GPU性能可能比您的开发机器低得多。建议您手动优化您的着色器以减少计算和纹理读取,以便在低端GPU机器上获得良好的性能。例如,一些内置的Unity着色器具有更快的“移动”等效,但是具有一些限制或近似。

以下是一些移动和低端PC显卡的指南:

复杂的数学运算

先验数学函数(如pow,exp,log,cos,sin,tan)是相当资源密集型的,所以避免在可能的地方使用它们。考虑使用查找纹理作为复杂数学计算的替代(如果适用)。

避免编写自己的操作(如normalize,dot,inversesqrt)。 Unity的内置选项确保驱动程序可以生成更好的代码。记住,AlphaTest(discard)操作经常使你的片段着色器更慢。

浮点精度

虽然浮点变量的精度(float vs half vs fixed)在桌面GPU上基本上被忽略,但在移动GPU上获得良好的性能是非常重要的。有关详细信息,请参阅着色器数据类型和精度页。

有关着色器性能的更多详细信息,请参阅着色器性能页。

简单的优化清单

  • 当构建PC(取决于目标GPU)时,保持顶点计数低于200K和3M每帧。
  • 如果您使用内置着色器,请从MobileUnlit类别中选择。他们也在非移动平台上工作,但是是更复杂的着色器的简化和近似版本。
  • 保持每个场景的不同materials的数量低,并且在不同对象之间共享尽可能多的materials。
  • 在不移动的对象上设置静态属性以允许内部优化,如静态批处理。
  • 只有一个(最好是定向)像素光影响你的几何,而不是倍数。
  • 烘烤照明而不是使用动态照明。
  • 尽可能使用压缩纹理格式,并在32位纹理上使用16位纹理。
  • 避免在可能的地方使用雾。
  • 在具有大量遮挡的复杂静态场景的情况下,使用遮挡剔除来减少可见几何和绘图调用的数量。设计你的水平与遮挡剔除。
  • 使用天空盒“伪造”遥远的几何。
  • 使用像素着色器或纹理组合器混合几个纹理,而不是多通道方法。
  • 尽可能使用半精度变量。
  • 最小化在像素着色器中使用复杂的数学运算,如pow,sin和cos。
  • 每个片段使用较少的纹理。

更多详情可参考Unity官方手册:Optimizing graphics performance

0 0
原创粉丝点击