- 音频的优化
1、在背景音乐比较长的资源中设置Load Type为Streaming,Quality设置为50
在Load Type中除了Streaming 还有其他两个参数
DecomPress On Load :在游戏开始的时候写入内存
ComPressed In Memory:在使用的时候写入内存
Streaming:边写入边播放
设置完之后的前后对比
- UGUI制作图集
制作图集可以有效减少DrawCalls的数量,每一个场景尽量做成一个大图集,减少性能的消耗。
在Unity中使用原生UGUI制作图集的方式:
首先我们在菜单栏里打开Editor->Project Settings -> Editor,界面如下:
这时在Sprite Packer的Mode中有三个参数:
Disabled:表示不启用图集
Enabled For Builds:表示只有在打包时启用
Always Enabled:表示永远启用它
这里我们选择Always Enabled表示永远启用它,有的因为勾选的不同可能需要选择(Always Enabled(Legacy Sprite Packer))
选择需要打成图集的图片,在Packing Tag 设置一个Tag,做成一个图集,命名要一致。如:
最后Apply一下就可以了。
制作完成后,在菜单栏打开 Window -> Sprite Packers就能够看到,如果看不到点击左上角的Pack按钮就可以了。
这时我们会想图集存储在哪里了??它保存在和Assets文件夹同级的目录,Libary/AtlasCache里面。你不用管它,也不要删除它,就算你删除了也没用因为只要你打包,它就会生成并且会打到包中。
注:图片放在Resources文件夹不可以打成图集
- UI资源优化
在Unity制作游戏过程少不了大量的图片,在内存中占用了很大一块,所以对于资源的显的很有必要。
在美术同学给的资源时候很多是拿过来直接放入Unity中,或者做一下九空格进行缩放,很少关注他们给的尺寸大小,因此造成内存过大的问题。下面举一个简单的例子如图:
这个图片的大小是1265*673 在PC端显示的占用内存是3.2MB
现在通过稍微修改一下图片的大小
会发现图片在PC端所占用的内存只有0.5MB,占用内存不到原来的1/6,效果还是很明显的。
修改的内容就是设置图片的像素大小,从原来的像素1265*673到现在1024*512,,图片没有减少很多,而且通过设置不会太多影响图片的质量。
总结:让图片尽量设置成2的幂次方,这样Unity引擎会自动帮你压缩图片。
- C#和lua的相互调用
游戏为了热更新很多游戏使用了lua框架,在两种语言相互调用的时候会出现很多效率、GC问题。
我们一般在lua中写入主要的游戏逻辑,但是这种是比较消耗性能的,可以把游戏中经常调用的方法写在C#中通过lua去调用。
如:游戏一般有很多大量设置position的地方,就可以再C#封装一个方法,在lua端去调用。
public static void SetLocalPos(GameObject go, float x = 0, float y = 0, float z = 0)
{
if (x == 0 && y == 0 && z == 0)
go.transform.localPosition = Vector3.zero;
else
go.transform.localPosition = new Vector3(x, y, z);
}
注意事项:1、传参建议使用 int float double 次严重 bool string 各种object 严重类型:Vector、Quaternion等Unity类型,数组
2、如果坐标为(0,0,0)要使用Vector3.zero,这样效率会比较高
3、具体的数据可以参考:用好Lua+Unity,让性能飞起来——Lua与C#交互篇
- C#中字符串拼接:
C#中字符串拼接可以使用StringBuilder进行字符串拼接,不要使用字符串相加的形式,因为这样会带额外的内存垃圾。如下代码所示
建议:
StringBuilder myStr = new StringBuilder();
myStr.Append("Hello").Append("The").Append("World");
不建议:
string myStr = "Hello" + "the" + "world";
- 优化DrawCall
1、相同的材质放在一块渲染,不会被其他的材质所打断渲染。比如使用UGUI,图片放在一起中间不要夹杂着Text或者其他的 组件。
2、尽量少使用Scale,会造成不能批处理;
①同一张资源缩放尺度(1,1,1)和(2,2,2)的两个物体不会进行批处理;
②使用缩放尺度(1,1,1)和(1,2,1)的相同材质不能批处理,但是使用缩放尺度(1,2,1)和(1,3,1)的相同材质的物体可 以批处理;
3、使用不同材质的实例化物体(instance)将会造成批处理失败。
4、在不移动不缩放的物体,可以使用批处理,使用静态批处理不要在移动,不然开销的内存会更大。
5、在UGUI的Mask下子物体不要挂一些子物体,这样会增加DrawCall的面数;因为在Mask之外的部分也会被渲染,但是 RectMask2D不会渲染超出的部分。
①如果使用2D的界面,在使用ScrollRect在下面的遮罩可以使用RectMask2D。
文章持续更新,未完待续。。。
小编很菜,如果有不对的地方,请帮忙指出。