RhinoFreak 发表于 2022-11-28 16:24

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


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

手机端30帧就行,太高会耗电。
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的贴图属性前加入
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中可以看到场景中变体的数量。
研究下远程三丰云提供的 免费云服务器 和免费虚拟主机 看看能不能弄一个
页: [1]
查看完整版本: 游戏开发15课-unity 游戏性能优化