01
地形
a· 地形的分辨率大小
长宽均尽量小于257。这是因为地形太大,会造成大量顶点数据,给你的内存带宽造成一定的影响,在目前的ios设备中,内存带宽是非常有限的,需要尽量节省。同时,如果用Unity自带的地形,一定也要使用Occlusion Culling,因为Unity的刷地形工具虽然方便,但却是framekiller,刷过之后,你会发现drawcall增加的非常多。
b· 混合纹理数量
不要超过4。地形的混合操作是很耗时的,应该尽量避免。能合并的纹理尽量合并。
02
纹理
a· 纹理格式
建议png或tga。不用转成ios硬件支持的PVRTC格式,因为Unity在发布时会帮你自动转的。
b· 纹理尺寸
长宽小于1024。同时应该尽可能地小,够用就好,以保证纹理对内存带宽的影响达到最小。
c· 支持Mipmap
建议生成Mipmap。虽然这种做法会增加一些应用程序的大小,但在游戏运行时,系统会根据需求应用Mipmap来渲染,从而减少内存带宽。
d· 检查Alpha值
如果纹理的alpha通道均为1,则用RGB的24位纹理来代替RGBA的32位纹理。(据说Unity内部会进行自动检测)
03
光源
a· 合并相近的模型,手动在模型编辑器中合并或者使用UNITY的Draw call批处理达到相同效果(Draw call batching)。
b· 在项目中使用更少的材质(material),将几个分开的贴图合成一个较大的图集等方式处理。(有一个合并模型材质不错的插件叫Mesh Baker,大家可以考虑试下。)
04
粒子特效
a· 屏幕上的最大粒子数
建议小于200个粒子。
b· 每个粒子发射器发射的最大粒子数
建议不超过50个。
c· 粒子大小
如果可以的话,粒子的size应该尽可能地小。因为Unity的粒子系统的shader无论是alpha test还是alpha blending都是一笔不小的开销。同时,对于非常小的粒子,建议粒子纹理去掉alpha通道。
d· 尽量不要开启粒子的碰撞功能。
非常耗时。
05
音频
a· 游戏中播放时间较长的音乐(如背景音乐)
使用.ogg或.mp3的压缩格式。
b· 较短音乐(如枪声)
使用.wav和.aif的未压缩音频格式。
06
相机
a· 裁剪平面
将远平面设置成合适的距离。远平面过大会将一些不必要的物体加入渲染,降低效率。
b· 根据不同的物体设置不同的远裁剪平面
Unity提供了可以根据不同的layer来设置不同的view distance,所以我们可以实现将物体进行分层,大物体层设置的可视距离大些,而小物体层可以设置地小些,另外,一些开销比较大的实体(如粒子系统)可以设置得更小些等等。
07
碰撞
尽量不用MeshCollider
如果可以的话,尽量不用MeshCollider,以节省不必要的开销。如果不能避免的话,尽量用减少Mesh的面片数,或用较少面片的代理体来代替。
08
其他
a· Drawcall
尽可能地减少Drawcall的数量。IOS设备上建议不超过100。减少的方法主要有如下几种:Frustum Culling,Occlusion Culling,Texture Packing。
Frustum Culling是Unity内建的,我们需要做的就是寻求一个合适的远裁剪平面;Occlusion Culling,遮挡剔除,Unity内嵌了Umbra,一个非常好OC库。但Occlusion Culling也并不是放之四海而皆准的,有时候进行OC反而比不进行还要慢,建议在OC之前先确定自己的场景是否适合利用OC来优化;Texture Packing,或者叫Texture Atlasing,是将同种shader的纹理进行拼合,根据Unity的static batching的特性来减少draw call。
建议使用,但也有弊端,那就是一定要将场景中距离相近的实体纹理进行拼合,否则,拼合后很可能会增加每帧渲染所需的纹理大小,加大内存带宽的负担。这也就是为什么会出现“DrawCall降了,渲染速度也变慢了”的原因。
b· 非运动物体尽量打上Static标签
Unity在运行时会对static物体进行自动优化处理,所以应该尽可能将非运行实体勾上static标签。
c· 场景中尽可能地使用prefab
尽可能地使用prefab的实例化物体,以降低内存带宽的负担。检查实体的PrefabType,尽量将其变成PrefabInstance,而不是ModelPrefabInstance。
d· 尽量减少alphaTest和alphaBlend材质的使用。在手机上,这是很杀效率的。
e· 网格:如果可能的话,把相邻的物体(网格)合并为一个只有一个材质的物体(网格)。比如,你的游戏中包含一个桌子,上面有一堆东西,你完全可以在3D程序中将它们合并在一起(这可能也需要你将这些物体的纹理合并为一个大的纹理集)。减少需要渲染的物体的数量可以极大地提高游戏性能。
f· 性能占用顺序:聚光灯>点光源>平行光。
一个好的点亮场景的方法就是先得到你想要的效果,然后看看哪些光更重要;在保持光效的前提下看看哪些光可以去掉。点光源和聚光灯只影响它们范围内的网格。
如果一个网格处于点光源或者聚光灯的照射范围之外,并且光源的attenuate开关是打开的,那么这个网格将不会被光源所影响,这样就可以节省性能开销。
这样做理论上来讲可以使用很多小的点光源而且依然能有一个好的性能,因为这些光源只影响一小部分物体。
一个网格在有8个以上光源影响的时候,只响应前8个最亮的光源。
09
模型方面优化
a· 合并使用同贴图的材质球,合并使用相同材质球的Mesh
b· 角色的贴图和材质球只要一个,若必须多个则将模型离分离为多个部分
c· 骨骼系统不要使用太多
d· 当使用多角色时,将动画单独分离出来
e· 使用层距离来控制模型的显示距离
f· 阴影其实包含两方面阴暗和影子,建议使用实时影子时把阴暗效果烘焙出来,不要使用灯光来调节光线阴暗
g· 少用像素灯和使用像素灯的Shader
h· 如果硬阴影可以解决问题就不要用软阴影,并且使用不影响效果的低分辨率阴影
i· 实时阴影很耗性能,尽量减小产生阴影的距离
j· 允许的话在大场景中使用线性雾,这样可以使远距离对象或阴影不易察觉,因此可以通过减小相机和阴影距离来提高性能
k· 使用圆滑组来尽量减少模型的面数
l· 项目中如果没有灯光或对象在移动那么就不要使用实时灯光
m· 水面、镜子等实时反射/折射的效果单独放在Water图层中,并且根据其实时反射/折射的范围来调整
n· 碰撞对效率的影响很小,但碰撞还是建议使用Box、Sphere碰撞体
o· 建材质球时尽量考虑使用Substance
p· 尽量将所有的实时反射/折射(如水面、镜子、地板等等)都集合成一个面
q· 假反射/折射没有必要使用过大分辨率,一般64*64就可以,不建议超过256*256
r· 需要更改的材质球,建议实例化一个,而不是使用公共的材质球
s· 将不须射线或碰撞事件的对象置于IgnoreRaycast图层
t· 将水面或类似效果置于Water图层
将透明通道的对象置于TransparentFX图层
u· 养成良好的标签(Tags)、层次(Hieratchy)和图层(Layer)的条理化习惯,将不同的对象置于不同的标签或图层,三者有效的结合将很方便的按名称、类别和属性来查找
v· 通过Stats和Profile查看对效率影响最大的方面或对象,或者使用禁用部分模型的方式查看问题到底在哪儿
w· 使用遮挡剔除(Occlusion Culling)处理大场景,一种较原生的类LOD技术,并且能够“分割”作为整体的一个模型。
Xrender for Unity 是渲云旗下一款面向三维设计师的自助式云烘焙工具,是三维视频游戏、建筑可视化、数字化工厂、自动驾驶仿真、虚拟城市、实时三维动画等多领域三位内容制作提供云端烘焙服务。
云烘焙官网:http://unity.xrender.com
客服热线:4006-888-245
客服Q Q:3137054620 805331994

