场景基本上占游戏性能一大部分(内存和渲染)所以优化按优先级,先优化场景
加载都是基于Assetbundle情况下
1.动态加载,场景里面所有东西都保存预设,把场景数据保存配置表,加载的时候都是读取配置动态加载预设,唯一好处就是可以实现不同场景公用预设
2.整个场景打包,把公用的东西都设置标签例如:fbx,材质球
1.减面:对场景模型减面优化是最常见的优化操作。主要是去掉对模型造型没有影响的面,用尽可能少的面数表达清楚模型的结构和造型。比如:物件非关节点及物件背面、内部不会看见的面删掉,这里提供一个"场景检查工具"
2.合并模型(小范围内才能使用):合并同一小范围内的非交互类的静态小物件,同时合并小物件的贴图。这样可以减少DRAW CALL的数量。一组大小形状不同的石头,如果同一个物体,然后距离很远,然后合并就没什么意义,可能负优化
3.LOD:建筑和复杂的物件用LOD模型和远处剔除来减少同屏面数。地形的LOD系统也可以对地形的面数做很大的优化。
4.模型的重复利用:相同的多个物件在unity内复制使用,复制的多个物体在引擎计算上算一个物体。但也不可复制太多个,太多会对内存带来很大压力。相同的物件太多,建议把几个合并成一组做为一个Object,多做几组,再进行复制。参考②。
5.地形优化:如果是用unity自带的地形工具制作的地形,可以用T4M插件转化成T4M格式地形,设置一个顶点值转化后可以对地形优化很多。T4M也可以设置lod模型。
使用工具可以查看贴图格式大小 工具链接“场景检查工具”
1.贴图大小:在移动设备上的贴图最大要控制在1024和512大小,可少量使用2048大小的贴图,以1024、512大小贴图为主。
2.重复贴图的使用:大面积相同材质使用1-3种贴图交替重复覆盖,通过光影变化打破贴图的重复感。
3.小物件的贴图合并,上文有讲,单个物体的贴图最好是一张,最多不易超过3张。相同贴图的材质球统一。
4.少用透明贴图,能不用就不要用。透明贴图非常消耗GPU资源。
5.支持Mipmap, Mipmap 会增加游戏包体的大小和占用一定量的内存,但在游戏中Mipmap的渲染可以减少显存带宽,降低渲染压力,随着相机的推远贴图会随之切换成低像素的体贴,从而节省资源开支。过的Mipmap使用会对内存造成很大压力,因此建议只对大物件设置Mipmap。
6.小场景可以用PBR材质,用PBR材质就一定要用实时灯光才有效果。大场景避免使用PBR材质,大场景尽可能用烘焙光影来达到光照效果。
7.法线贴图:烘焙的场景模型就不要用法线贴图了,贴了也没效果,还占空间资源。
8.贴图压缩,对贴图进行PVRT(Ios)或是ETC(Android) ETC2(带alpha通道)格式的压缩可以减少大量内存消耗,如果前面的两个格式满足不了美术,而且不考虑低端机,可以考虑用其他格式例如astc(5x5),可用格式参考下图
1.屏幕上的最大粒子数:建议小于200个粒子。
2.每个粒子发射器发射的最大粒子数:建议不超过50个。
3.粒子大小:粒子的size应该尽可能地小。因为Unity的粒子系统的shader无论是alpha test还是alpha blending都是一笔不小的开销。同时,对于非常小的粒子,建议粒子纹理去掉alpha通道。
4.不要开启粒子的碰撞功能。
5.粒子特效shader用mobile,不满足需求只能让程序加
1.光源“Important”个数:建议1个,一般为方向光。“Important”个数应该越小越少。个数越多,drawcall越多。
2.Pixel Light数目:建议1-2个。
3.场景烘焙,手机游戏一般都要烘焙场景,不开实时光照,实时光照只给主角
首先我们要先理解为何2个没有使用相同材质的物体即使使用批处理,也无法实现Draw Call数量的下降和性能上的提升。
因为被“批处理”的2个物体的网格模型需要使用相同材质的目的,在于其纹理是相同的,这样才可以实现同时渲染的目的。因而保证材质相同,是为了保证被渲染的纹理相同。
因此,为了将2个纹理不同的材质合二为一,我们就需要进行上面列出的第二步,将纹理打包成图集。具体到合二为一这种情况,就是将2个纹理合成一个纹理。这样我们就可以只用一个材质来代替之前的2个材质了。
而Draw Call Batching本身,也还会细分为2种。
静态批处理
静态?那就是不动的咯。还有呢?额,听上去状态也不会改变,没有“生命”,比如山山石石,楼房校舍啥的。那和什么比较类似呢?嗯,聪明的各位一定觉得和场景的属性很像吧!所以我们的场景似乎就可以采用这种方式来减少draw call了。
那么写个定义:只要这些物体不移动,并且拥有相同的材质,静态批处理就允许引擎对任意大小的几何物体进行批处理操作来降低描绘调用。
那要如何使用静态批来减少Draw Call呢?你只需要明确指出哪些物体是静止的,并且在游戏中永远不会移动、旋转和缩放。想完成这一步,你只需要在检测器(Inspector)中将Static复选框打勾即可
PS:批处理会增加内存,内存和渲染效率,就看你怎么折中
1.尽可能不用mesh collider,要用的时候可以让美术简化一个mesh专做碰撞
2.尽量少用刚体,在刚体不用的情况下激活is kinematic
1.尽量不使用雾效
2.把自带的shader取消雾效功能
3.删除没用的animator脚本