• 音频的优化

    1、在背景音乐比较长的资源中设置Load Type为Streaming,Quality设置为50

    在Load Type中除了Streaming 还有其他两个参数

    DecomPress  On Load :在游戏开始的时候写入内存

    ComPressed In Memory:在使用的时候写入内存

    Streaming:边写入边播放

    设置完之后的前后对比

    

unity 绘制图片 unity图片设置_缩放

 

    

unity 绘制图片 unity图片设置_lua_02

  • UGUI制作图集

制作图集可以有效减少DrawCalls的数量,每一个场景尽量做成一个大图集,减少性能的消耗。

在Unity中使用原生UGUI制作图集的方式:

首先我们在菜单栏里打开Editor->Project Settings -> Editor,界面如下:

unity 绘制图片 unity图片设置_缩放_03

这时在Sprite Packer的Mode中有三个参数:

Disabled:表示不启用图集

Enabled For Builds:表示只有在打包时启用

Always Enabled:表示永远启用它

这里我们选择Always Enabled表示永远启用它,有的因为勾选的不同可能需要选择(Always Enabled(Legacy Sprite Packer))

选择需要打成图集的图片,在Packing Tag 设置一个Tag,做成一个图集,命名要一致。如:

unity 绘制图片 unity图片设置_lua_04

最后Apply一下就可以了。

制作完成后,在菜单栏打开 Window -> Sprite Packers就能够看到,如果看不到点击左上角的Pack按钮就可以了。

这时我们会想图集存储在哪里了??它保存在和Assets文件夹同级的目录,Libary/AtlasCache里面。你不用管它,也不要删除它,就算你删除了也没用因为只要你打包,它就会生成并且会打到包中。

注:图片放在Resources文件夹不可以打成图集

  • UI资源优化

在Unity制作游戏过程少不了大量的图片,在内存中占用了很大一块,所以对于资源的显的很有必要。

在美术同学给的资源时候很多是拿过来直接放入Unity中,或者做一下九空格进行缩放,很少关注他们给的尺寸大小,因此造成内存过大的问题。下面举一个简单的例子如图:

                                      

unity 绘制图片 unity图片设置_lua_05

这个图片的大小是1265*673 在PC端显示的占用内存是3.2MB

现在通过稍微修改一下图片的大小

                                       

unity 绘制图片 unity图片设置_批处理_06

会发现图片在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。

 

文章持续更新,未完待续。。。

小编很菜,如果有不对的地方,请帮忙指出。