unity 之Graphic 之优化图形处理

Optimizing graphics performance:优化图形处理

Locate high graphics impact:定位影响图形处理效果的因素

常见的原因:

  • GPU通常受fillrate填充率或内存带宽的限制。
    • 降低显示分辨率,运行游戏.如果低分辨率的时候,游戏运行更快,说明GPU主要受fillrate影响
  • CPU通常被渲染所需要的批处理的数量限制
    • 在Rendering Statistics(profiler面板)检查 “batches” 的数量,数量越多,cpu开销越大

不常见的原因:

  •  GPU需要处理太多的顶点 ,通常,在移动平台上不能超过100,000个顶点,PC上可以多点,但是顶点的数量越少,性能越好
  • CPU需要处理太多的顶点,这些顶点包含在skinned meshes, cloth simulation, particles, 或者其它游戏物体的网格上,尽可能的让这些顶点变少
  • 如果不是这两个的问题,那可能是你脚本的问题,或者physic ,使用 Unity Profiler 来定位原因

 

UI优化

https://www.cnblogs.com/imteach/p/10566268.html

CPU optimization:CPU优化

CPU负责物体上的光照显示效果,设置shader的参数,把绘制这些图形的命令发送到图形处理的驱动上,然后图形驱动发送命令到显卡上

每一个网格都会单独绘制一次,网格越多,绘制的命令就越多,越耗CPU性能,例如,如果你有一千个三角形,如果它们都在一个网格中,CPU会更容易处理,而不是一个三角形一个网格(加起来有1000个网格).

减少CPU的损耗采取以下步骤:

  • 合并相近的物体,或者手动使用Unity’s draw call batching->接下来会讲
  • 通过把多个texture放进图集当中,来减少material的数量,从而减少了shader的使用数量
  • 使用较少造成渲染时间增加的物体,比如reflection,shadow, per-pixel lights

如果合并两个物体,一定要把material也也合并了,也就是说合并后的物体只使用一个材质球,这样才能减少性能,否则,合并也白搭,两个物体使用不同材质球的原因是它们的贴图不一样,确保你要合并的物体使用相同的贴图

 

渲染管线:

https://www.jianshu.com/p/02eebbf9ad9a

https://blog.csdn.net/qq_40229737/article/details/88391660

GPU: Optimizing model geometry:优化模型的几何形状

  • 模型中尽可能的减少三角面数
  • 保持UV贴图接缝和硬边(双重顶点)的数量尽可能低

Unity中顶点的数量往往大于 3D建模软件中的数量,因为当一个顶点含有多个法线贴图,UV顶点时,他需要分割多个顶点来渲染

Lighting performance

最好的选择就是创建不需要计算的灯光。使用 Lightmapping “bake”烘焙静态对象 static lighting ,虽然烘焙时间长,但是运行时间短

很多时候可以用一些小技巧来添加关照效果,而不是增加一盏灯光,比如:你可以在你的shader当中添加一个Rim Lighting(边缘灯光)而不是直接打一个光,让边缘发亮 (see Surface Shader Examples to learn how to do this).

Lights in forward rendering

Also see: Forward rendering

避免多个灯光实时照射单个物体,比如舞台上的效果,使用静态贴图代替

避免合并一些距离太远而产生了不同的效果的网格,当你使用pixel lighting实时光照时,每一个网格都会被渲染很多次,Avoid combining meshes that are far enough apart to be affected by different sets of pixel lights,一般来说,渲染合并对象所需要的pass次数是每个单独对象的pass次数之和,因此合并距离较远的网格不会得到任何结果,因为虽然合并了,但是还是要分别渲染。

在渲染过程中,Unity会找到网格周围的所有灯光,并计算哪些灯光对网格影响最大,Quality窗口上的设置用来修改有多少个灯最终成为pixel lights,有多少个灯最终成为vertex lights顶点灯。每一盏灯都根据它离网格的距离和光照强度来计算它的重要性,有些灯比其他的更重要. 所以,每一个拥有 Render Mode 设置的等都有 Important or Not Important; 标记为 Not Important 性能开销更低一些

Example: 假设在一款驾驶游戏中,玩家的车开着前灯在黑暗中行驶。前灯可能是游戏中最重要的视觉光源,所以它们的渲染模式应该设置为Important。游戏中可能会有其他不太重要的灯,比如其他车的尾灯或远处的灯柱,它们并不能通过像素灯来改善视觉效果。这样的灯光渲染模式可以安全地设置为Not Important,以避免浪费渲染能力。

 

GPU: Texture compression and mipmaps:压缩贴图,使用mipmap

使用 Compressed texture 减少 textures的大小,这可以减少加载时间、和内存占用,并显著提高呈现性能. 压缩纹理只使用未压缩的32位RGBA纹理所需内存带宽的一小部分

Texture mipmaps

始终在3D场景中打开textures的 Generate mipmaps . 一个mipmap纹理使GPU能够对较小的三角形使用低分辨率纹理。这类似于纹理压缩可以帮助限制GPU渲染时传输的纹理数据量

这个规则的唯一例外是当一个texel(纹理像素)是1:1映射到渲染的屏幕像素时,就像在UI元素或2D游戏中一样。

LOD and per-layer cull distances

Culling objects剔除看不到的物体,就是遮挡剔除

There are a number of ways you can achieve this:

  • 使用 Level Of Detail 系统

  • 手动设置相机上的剔除距离

  • 把小物体放到一个单独的曾里面,并使用Camera.layerCullDistances 剔除掉

Realtime shadows

实时阴影

GPU: Tips for writing high-performance shaders:编写高性能着色器的技巧

不同的平台具有截然不同的性能能力; 在图形和着色器方面,高端PC GPU比低端移动GPU能处理更多的图形和着色器。即使在单一平台上也是如此;速度快的GPU比速度慢的GPU快几十倍。

 所以建议编写高效的shader,例如,一些内置的Unity着色器比如有“mobile”,它们更快,但是有一些限制

复杂的数学运算

数学函数(比如pow, exp, log, cos, sin, tan) 是资源密集型,所以尽量避免使用, 考虑使用查找纹理作为复杂数学计算的替代(如果适用的话)。

避免编写自己的操作(such as normalize, dot, inversesqrt).unity里面有更好的.

Floating point precision

虽然浮点变量的精度(float vs half vs fixed)在pc端的gpu中很大程度上被忽略不计,但是在移动gpu上获得良好的性能是非常重要的, See the Shader Data Types and Precision , Shader Performance page.

Simple checklist to make your game faster

  • PC平台(取决于目标平台的GPU性能),将顶点数保持在每帧200K和3M以下。
  • 保持每个场景中不同材质的数量较低,并在不同对象之间尽可能多地共享材质
  • 在非移动对象上设置静态属性,以允许内部优化,如静态批处理
  • 尽量只是用一个 pixel light实时光照,比如平行光
  • 烘烤照明比动态照明好
  • 尽可能使用压缩的纹理格式,使用16位纹理而不是32位纹理。
  • 尽量避免使用雾。
  • 在具有大量遮挡的复杂静态场景中,使用遮挡剔除来减少可见几何图形和绘制调用的数量。在设计关卡时要考虑遮挡剔除
  • 使用天空盒来“伪造”远处的几何图形。就是天空里面有一些虚假的建筑影像
  • 使用像素着色器或纹理组合器混合多个纹理,而不是使用 multi-pass多通道方法。
  • shader中使用 half精度尽可能的
  • 较少使用 pow, sin and cos
  • 每个片段fragment使用更少的纹理 textures

你可能感兴趣的:(Optimizing,Graphic)