资源的优化
资源的拆分和复用
贴图:当一个物体的材质依赖了两张或者两张以上的图集时,可以将图集进行拆分 将试用到的贴图单独打成图集,这样这个物体就只需要使用一张图集,从而达到降低drawcall的目的,但是打图集之后,会产生一些多余的透明区域,所以打图集可能带来的坏处就是增大了内存,外存(可以理解为资源在用户的硬盘里占了多少M)选择规则如下
1 不用的图不打,因为图集就算从不使用,也还是会进入到最终的apk里面
2 小的图尽可能打包
3 大图(比如大于512x512,常见的有UI底图)不打包。因为大图会很有可能产生透明区域;
动画拆分:当使用多角色时,可以将动画单独分离出来,只要是人形动画,骨骼个数一样 那么这些动画可以互用的 。这里需要主要注意的是 一般情况下美术提供的动画是不需要位移的
材质球的合并:目的也是减少drawcall的产生,比如一个角色身上带了十个装备,每个装备是一个fbx,每个fbx又需要不同的材质,这么算下来,加上身体一共11个drawcall,如果一个场景就10个这样的角色,光是这些角色drawcall就达到了110,所以材质球的合并是非常有必要的
合并的条件:
1 .合并的材质球需要使用同一个shader,如果多个材质球使用了不同shader,就要做进一步的出分类处理了
2.材质球所用的Textrue文件Read/Write Enable选项要勾选
批处理
Unity在运行时可以将一些物体合并,从而绘制一次就可以渲染他们。这一操作,称之为“批处理”。Unity批处理的物体越多,渲染的性能就更好。
只有相同的材质才可以进行批处理,但是有的时候,两个材质仅仅是纹理不同,那么就可以通过纹理合并也就是常说的打图集, 你就可以使用这个单一的材质来替代之前的两个材质了
动态批处理
物体如果公用这同一材质,那么Unity是会自动进行批处理,也就是说动态批处理是自动完成的,不需要去额外的操作。
需要注意的是
- 统一缩放尺度的物体不会与非统一缩放尺度的物体进行批处理。
- 使用缩放尺度(1,1,1)和 (1,2,1)的两个物体将不会进行批处理,但是使用缩放尺度(1,2,1)和(1,3,1)的两个物体将可以进行批处理。
- 批处理动态物体需要在每个顶点上进行一定的开销,所以动态批处理仅支持小于900顶点
- 使用不同材质的实例化物体(instance)将会导致批处理失败。
- 有lightmap的物体将不会进行批处理,拥有的Lightmap的物体含有额外的属性(这些属性是隐藏的)
静态批处理
相对而言,静态批处理操作允许引擎对任意大小的几何物体进行批处理操作来降低绘制调用(只要这些物体不移动,并且拥有相同的材质)。因此,静态批处理比动态批处理更加有效,应该尽量低使用。
资源格式
模型:fpx。
需要注意的是
- 所有角色模型最好站立在原点。没有特定要求下,必须以物体对象中心
- 碰撞对效率的影响很小,但碰撞还是建议使用Box、Sphere碰撞体
- 如果可以的话,尽量不用MeshColler,以节省不必要的开销,如果不能避免的话,尽量减少Mesh的面片数,或者使用较少的面片的代理题来代替
- 实时阴影很耗性能,尽量减小产生阴影的距离
- 骨骼不要使用太多
图片:不论放入的是PNG,PSD 还是tga,他们都会被自动转成Unity自己的Textrue2D格式。在Textrue2D的设置选项中,你可以针对不同的平台,设置不同的压缩格式,然后可以根据不同的平台选择不同的压缩格式
手机开发中(Android/IOS)中,可以使用3个级别的压缩,高清晰无压缩,中清晰中压缩,低清晰高压缩,4中压缩方法 RGBA32, RGBA16+Dithering,ETC1+Alpha,PVRTC4。一般足够应付大部分的需求了
高清晰无压缩 RGBA32:
等同于原图了,优点是清晰、与原图一致,缺点是内存占用十分大;对于一些美术要求最好清晰度的图片,是首选。
中清晰中压缩 RGBA16:
不抖动处理的渐变图片惨不忍睹,对于一些采用渐变的图片,从RGBA32转换成RGBA16,能明显的看出颜色的层叠变化
对于一些采用渐变的图片,既然叫RGBA16,自然就是RGBA32的简化版。
RGBA16的优点
内存占用是RGBA32的1/2;搭配上Dithering抖动,在原尺寸下看清晰度一模一样;
缺点,Unity原生不支持Dithering抖动,需要自己做工具对图片做处理;对于需要放大、拉伸的图片,Dithering抖动的支持不好,会有非常明显的颗粒感
Dithering抖动 只需要使用Texture Packer工具中的Image Format选择RGBA4444(每个响像素2个字节,RGBA通道各占用4位) Dithering选择FloydSteinberg,然后在导入Unity中就可以使用了。
开发中有些场合,ETC或者说PVRTC压缩质量不满足的情况下,RGBA32(原图)对美术而言肯定可以满足的,但是RGBA32是不管是对内存占用内存太厉害.
低清晰高压缩 - ETC1 /PVRTC4
我们经常看一些图片需要设置成2的次方,因为像ETC1、PVRTC4等这类在内存中无需解压、直接被GPU支持的格式,占用内存极低,而且性能效率也是最好的。但是,相对RGBA32,还是能肉眼看出质量有所下降的。
PVRTC4
在Unity中是直接支持的,不过要注意的细节是,它必须是二次方正方形;也就是说,长宽在二次方的同时,还必须要相等
ETC1:
ETC1 一般应用在Android版的UI图集中,并没有透明通道 android市场的手中的Gpu有多钟,每家的Gpu都支持不同的压缩格式,但是他们都兼容ETC格式,android 对etc也有比较好的支持
Android:
普通不透明:RGB ETC 4BITS
普通透明:是ETC1+Alpha 或者ETC2 8BITS
IOS
普通不透明:RGB PVRTC 4BITS
普通透明:RGBA PVRTC 4BITS
非正方贴图:
一般采用16位压缩,16位会带来颜色损失,但如果本来美术就是按16BITS画的话,就不会损失。日本好些手游都是按16BITS来画的。这样的游戏一般少渐变艳度高比较容易看出来。a.不透明贴图: RGB 16BITS
d.透明贴图:RGBA 16BITS
总结 尽可能是使用ETC和PVRTV4等GPU直接支持的图片格式,不仅内存占用低、性能也更好;当出现质量不及格时,再逐步的提升压缩格式,来满足需要。
因此,实际项目中要混搭各种纹理格式。
资源的命名
模型不能使用中文命名(包括中文标点符号),必须使用英文命名,命名中不能包含“.”字符。地形、建筑、角色模型不允许出现重名。
规格如下
材质 mat_Protagonist
贴图 tex_Protagonist
带Alpha材质 mat_wenli_al
带Alpha贴图 tex_wenli_al
所有文件后缀必须为小写 tex_wenli_al.png
美术给的资源一般都存放在art/GameAsset的目录下面,在其分为若干个子目录.根据美术给的不同资源类型放入其对应子目录
骨骼
根数: 小怪 小于30根
人物 70以下 低模50以下
Boss 55已下
贴图
注意的地方
- 带Alpha通道的贴图存储为32tga或者png格式,在命名是必须加_al以区分
- 原始贴图不带通道的格式为jpg
- 贴图不能为中文命名,不能有重名
- 图文件尺寸须为2的N次方 (8、16、32、64、128、256、512、1024)最大贴图尺寸不能超过1024x1024
- UI贴图尺寸可以不遵循2的N次方设计。
- 最大贴图尺寸不能超过1024x1024
- 能使用九宫格的尽量使用九空格
• 控制UV值范围 • UV值范围尽量不要超过(0, 1)区域 ,这对于将来的纹理拼合优化很有帮助
支持Mipmap
Mipmap技术有点类似于LOD技术,但是不同的是,LOD针对的是模型资源,而Mipmap针对的纹理贴图资源,使用Mipmap后,贴图会根据摄像机距离的远近,选择使用不同精度的贴图。所已建议生成MipMap,虽然这种做法会增加一些应用程序的大小,但在游戏运行时,系统会根据需求来进行是否用MipMap来渲染,提高一些渲染效率
设置MipMap的方式:设置贴图的Texture Type为Advanced类型 → 勾选Generate Mip Maps → Apply应用 。
需要注意的是
UI图片是不需要mipMap 一是因为UI图片很少会缩放,二是因为mipmap会生成多张小图来避免缩小图片时没必要的GPU采样消耗,mipmap的图片会比不使用的图片多占约三分之一的内存。
检查Alpha值
如果纹理的alpha通道均为1,则用RGB的24位纹理来代替RGBA的32位纹理。(据说Unity内部会进行自动检测)
粒子特效
• 屏幕上的最大粒子数
建议小于200个粒子。
• 每个粒子发射器发射的最大粒子数
建议不超过50个。
• 粒子大小
如果可以的话,粒子的size应该尽可能地小。因为Unity的粒子系统的shader无论是alpha test还是alpha blending都是一笔不小的开销。
同时,对于非常小的粒子,建议粒子纹理去掉alpha通道。
• 尽量不要开启粒子的碰撞功能。
非常耗时。