游戏开发-unity 游戏性能优化

1.基础
渲染分析:
FPS:(Frames Per Second):一秒内渲染多少帧。

手机端30帧就行,太高会耗电。游戏开发-unity 游戏性能优化_第1张图片

1.摄像机深度
摄像机的默认深度是-1, 深度越高,越晚绘制,所以深度低的就被深度高的覆盖了。

将不需要渲染的物体设置在一个层级,在摄像机面板的Culling Mask中取消这个层级

2.模型
1.尽可能降低三角面片数和UV数(UV数最好在4000一下,如果不是那就拆分),尽可能用同一张UV,贴图最好能循环使用,为了降低调用drawcall的次数。

2.Unity:不动的物体设置为Static,不会受到碰撞的物体取消或者删去碰撞检测,物理系统。同理,阴影也是。

3.合批batching
1.动态合批规则

材质相同时合批的前提,如果是材质实例的话(C#脚本中用shareMaterial),则不能合批.

支持不同网格的合批,材质相同就行

单个网格最多300个顶点,900个顶点属性

       如果shader中用到网格的Position、normal和UV,则最多是300个顶点

       如果shader中用到网格的Positon、normal、UV0、UV1和tangent,则最多180个顶点。

镜像的transform不能合批

Lightmap对象不能合批


2.静态合批规则:

选中相同材质的物体,设置为static,将layer设置为static batching,一个批次的物体会被渲染成同一个网格,所以会导致网格容量变大。

当顶点数超过32k后会生成另一个合批.


3.GPU实例化

用于对多个对象(网格一样、材质一样、但是材质属性不一样)合批,单个合批最大上限为511个对象。


4.设置LOD和Mip Map,使用LightMap
5.贴图
降低贴图尺寸,多个物体使用一张贴图,或者将几个贴图合并成一张贴图。

6.光照
减少像素光照,比如在场景中保持一个方向光采用逐像素的光照,其余的设置为Not Important。


2.shader优化
1.精度优化

2.能放到顶点的不要放在片段,因为片段是逐像素渲染,很耗性能。

3.一个Subshader内如果含有多个pass(不包含unity中起特殊作用的pass),则会渲染多次,同时不能进行合批。

4.在不需要Tilling和Offset的贴图属性前加入[NoScaleOffset]

5.GrabPass如果不指定贴图的名称,则每个对象的GrabPass都会每帧生成一次,如果指定贴图名称,则所有对象的GrabPass在一帧内只会生成一次。


6.尽量使用vertex/fragment(Unlit shader)而不是surface shader


7.利用shaderLOD实现高中低配硬件的区分

8.减少overdraw(一个物体被渲染多次就是overdraw),一般出现在渲染模式为透明的场景中。在场景【scene】下拉列表中选择overdraw就能看见,越亮的地方就是overdraw最多的部分。

9.减少变体的数量

定义变体:#pragma multi_compile _ FOG_LINEAR  //定义了一个fog_linear和一个空的变体

剔除变体:#pragma skip_variants FOG_EXP FOG_EXP2//剔除了FOG_EXP和FOG_EXP2变体


#pragma shader_feature D E F

如果在属性面板勾上“剔除没有被使用的shader_feature”,那么那些没有使用到材质中的shader_feature会不被计入变体数量中,但是如果都没有被使用,那么至少第一个shader_feature会被计入。


如果变体的功能是在游戏中被人手动关闭开启的,那么这些变体必须是multi_compile,而不是shader_feature,其余情况尽量使用shader_feature(特效,美术类).


Shader variants collection变体收集器:

将游戏中使用到的变体添加到变体收集器中,游戏会在开启前对这些变体进行预加载,防止游戏中加载导致卡顿。这样会增加shaderLab内存。


project setting-->Graphics-->shader loading中可以看到场景中变体的数量。

研究下远程三丰云提供的 免费云服务器 和免费虚拟主机 看看能不能弄一个

你可能感兴趣的:(游戏开发,unity,游戏,性能优化)