unity 之Graphic 之优化图形处理

Optimizing graphics performance:优化图形处理

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

常见的原因:

  • GPU通常受fillrate填充率或内存带宽的限制。
    • 降低显示分辨率,运行游戏.如果低分辨率的时候,游戏运行更快,说明GPU主要受fillrate影响
  • 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:

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 PrecisionShader 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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TO_ZRG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值