常见的原因:
不常见的原因:
https://www.cnblogs.com/imteach/p/10566268.html
CPU负责物体上的光照显示效果,设置shader的参数,把绘制这些图形的命令发送到图形处理的驱动上,然后图形驱动发送命令到显卡上
每一个网格都会单独绘制一次,网格越多,绘制的命令就越多,越耗CPU性能,例如,如果你有一千个三角形,如果它们都在一个网格中,CPU会更容易处理,而不是一个三角形一个网格(加起来有1000个网格).
减少CPU的损耗采取以下步骤:
如果合并两个物体,一定要把material也也合并了,也就是说合并后的物体只使用一个材质球,这样才能减少性能,否则,合并也白搭,两个物体使用不同材质球的原因是它们的贴图不一样,确保你要合并的物体使用相同的贴图
https://www.jianshu.com/p/02eebbf9ad9a
https://blog.csdn.net/qq_40229737/article/details/88391660
Unity中顶点的数量往往大于 3D建模软件中的数量,因为当一个顶点含有多个法线贴图,UV顶点时,他需要分割多个顶点来渲染
最好的选择就是创建不需要计算的灯光。使用 Lightmapping “bake”烘焙静态对象 static lighting ,虽然烘焙时间长,但是运行时间短
很多时候可以用一些小技巧来添加关照效果,而不是增加一盏灯光,比如:你可以在你的shader当中添加一个Rim Lighting(边缘灯光)而不是直接打一个光,让边缘发亮
(see Surface Shader Examples to learn how to do this).
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,以避免浪费渲染能力。
使用 Compressed texture 减少 textures的大小,这可以减少加载时间、和内存占用,并显著提高呈现性能. 压缩纹理只使用未压缩的32位RGBA纹理所需内存带宽的一小部分
始终在3D场景中打开textures的 Generate mipmaps . 一个mipmap纹理使GPU能够对较小的三角形使用低分辨率纹理。这类似于纹理压缩可以帮助限制GPU渲染时传输的纹理数据量
这个规则的唯一例外是当一个texel(纹理像素)是1:1映射到渲染的屏幕像素时,就像在UI元素或2D游戏中一样。
Culling objects剔除看不到的物体,就是遮挡剔除
There are a number of ways you can achieve this:
使用 Level Of Detail 系统
手动设置相机上的剔除距离
把小物体放到一个单独的曾里面,并使用Camera.layerCullDistances 剔除掉
实时阴影
不同的平台具有截然不同的性能能力; 在图形和着色器方面,高端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.
pixel light实时光照,比如平行光
half
精度尽可能的pow
, sin
and cos