Unity3d优化之路

转载 2015年07月10日 11:36:20

Unity3d优化之路.U3D的架构部分已经讲了很多了,这里我想讲讲对于U3D优化的亲身体验。

优化之路分三块:

一.渲染级别。

GUI部分:我使用的是NGUI,它对动态移动、旋转、缩放GUI支持的是比较差的,所以我尽量不要把过多的移动旋转缩放的部分写在GUI中,但很多情况下是避免不了的,比如:大量的伤害数字,物品掉落,图标的移动和旋转等,为了不让GUI去控制这些渲染物体,一小部分我使用3D面片代替,而大部分使用程序去生成面片渲染脱离了GUI的控制。另外在那些静态的GUI中,我使用了静态物体优化的属性,加上排除不必要的GUI设置,使得GUI部分效率足够高。

3D部分:特效是对画面效果最最有影响的部分,我尽量不使用粒子或者将粒子的数量减少到最小。尽量减少灯光的使用,而使用烘培后的图来代替。剔除那些不需要显示的模型。

2D部分:特效不放在GUI内,而是把特效放在非GUI的另一个摄像头内代替。所以,最终摄像头会有多各,总共叠层是这样的:top:gui_effect_camera , middle:gui_camera , bottom:3d_camera;

二.减少占用空间大小。

1.我使用的是动态资源的加载方式WWW方式。所以在导出资源时我使用BuildAssetBundleOptions.DisableWriteTypeTree 的打包方式,减少包的大小。

因为WWW缓存方式在下载后解压后还是会增大空间占用量,所以我使用StreamAssets这个在Unity3D里固定文件夹,把WWW资源放在那里,在游戏开始后进行缓冲读取,这样既减少了空间占用量,也可以进行异步的读取资源方式,唯一的缺点是但凡更改资源就需要玩家下载新的游戏包。对于两种方式的WWW资源加载,在具体项目当中可以共同使用,一部分使用网络加载,一部分使用本地StreamAssets加载。

2.对每张Texture,都设置对图片进行压缩。

3.让美术减少模型面片数,并在fbx模型设置中,设置对模型进行压缩

3.让美术减少动画帧数,并在动画设置中,设置对动画进行压缩

4.不使用System,System.Xml以及其他系统自带的DLL,他会多出几兆空间,而用开源的源码代替。

三.内存

1.最基本的就是对需要的资源进行加载,使用完毕后,释放。

2.GUI部分在GUIManager管理类中增加 对GUI进行定时检查的部分,对不展示的GUI资源进行释放。

3.因为有些时候一次性加载的资源过多,内存一下子会膨胀,IO过慢导致奔溃,所以我选择资源异步加载。使得加载这么多资源不那么可怕,并且平滑。

4.内存释放:这里有个重点,我重点测试了一下内存释放的忽视点。在我们利用ngui,或者2dtoolkit进行gui编程时,在释放其gui节点时通常会忘记将gui引用置为null,这就导致了内存泄漏。一些不再使用的贴图或者实例数据仍然继续存留在内存中。对于是否有需要将这些gui变量置为null的说法,我还做了一个实验。

首先将屏幕置空,没有任何多余内存,再将gui展示,接着隐藏gui销毁gameobject,先将所有引用变量置为null,然后再展示,再销毁,这次销毁,不将变量置为null。得出得内存结论就是,不将gui组件变量置为null的,贴图内存还会滞留。如下图:


测试代码如下:

    using UnityEngine;
    using System.Collections;
    public class testgui
    {
        private tk2dSprite tex;
        private GameObject root;
        private tk2dSprite tex1;
        private GameObject root1;
        private tk2dSprite tex2;
        private GameObject root2;
        public void show()
        {
            root =  GameObject.Instantiate( Resources.Load(“GameObject”) ) as GameObject;
            root.transform.parent = GameObject.Find(“ROOT/MIDDLE_CENTER”).transform;
            tex = root.GetComponent<tk2dSprite>();
            root1 =  GameObject.Instantiate( Resources.Load(“GameObject1″) ) as GameObject;
            root1.transform.parent = GameObject.Find(“ROOT/MIDDLE_CENTER”).transform;
            tex1 = root1.GetComponent<tk2dSprite>();
            root2 =  GameObject.Instantiate( Resources.Load(“GameObject2″) ) as GameObject;
            root2.transform.parent = GameObject.Find(“ROOT/MIDDLE_CENTER”).transform;
            tex2 = root2.GetComponent<tk2dSprite>();
        }
        public void hiden1()
        {
            GameObject.Destroy(root);
            GameObject.Destroy(root1);
            GameObject.Destroy(root2);
            Resources.UnloadUnusedAssets();
        }
        public void hiden()
        {
            GameObject.Destroy(root);
            GameObject.Destroy(root1);
            GameObject.Destroy(root2);
            root = null;
            root1 = null;
            root2 = null;
            tex = null;
            tex1 = null;
            tex2 = null;
            Resources.UnloadUnusedAssets();
        }
    }

请看红框内绿色曲线,第一次是置空的情况,内存立刻销毁,而第二次是不置空的情况,内存仍然驻留。结论很明显了,所以,在你编程时,将引用置空是件非常重要的事,这会直接影响到你的内存使用量。这也事c#垃圾回收机制引起的,当实例没有引用数量时内存才会被回收,并且彻底销毁。

 

笔者最后提醒优化无极限,其实都在细节中,能省一点CPU是一点,能省一点内存是一点。你不打败99.5%的其他人,你就没有机会功成名就。

转载请注明出处:http://www.luzexi.com


unity几种优化建议

内存优化
  • ElyXiao
  • ElyXiao
  • 2016年07月21日 11:54
  • 14486

Unity开发-你必须知道的优化建议

最近转U3D开发,个人认为,精通一种新的技术,最快最好的方法就是看它的document,而且个人习惯不喜欢看中文的资料,原汁原味的东西是最正确的,一翻译过来很多东西就都不那么准确了。于是通读了unit...
  • leonwei
  • leonwei
  • 2014年01月09日 16:03
  • 26549

Unity优化总结

通过纹理格式、限帧、资源优化、脚本代码优化、渲染优化等优化方法,大幅提高了我们游戏的渲染表现。...
  • ynnmnm
  • ynnmnm
  • 2014年07月04日 02:17
  • 6695

【Unity技巧】Unity中的优化技术

写在前面这一篇是在Digital Tutors的一个系列教程的基础上总结扩展而得的~Digital Tutors是一个非常棒的教程网站,包含了多媒体领域很多方面的资料,非常酷!除此之外,还参考了Uni...
  • candycat1992
  • candycat1992
  • 2014年12月26日 21:44
  • 102858

Unity3D性能优化方案

一:什么是性能优化? 常见的优化类型包括:性能优化(重点),流程优化,体验优化。 性能优化的目标:(1)游戏流畅运行,(多种帧数标准,避免卡顿) 常见的帧数标准:60帧(终极目标),30帧(移动...
  • qq_37601496
  • qq_37601496
  • 2017年11月30日 09:40
  • 96

Unity性能优化之内存篇(上)

项目的性能优化主要围绕CPU、GPU和内存三大方面进行。接上期CPU优化专讲,我们本期和大家分享内存方面的优化心得。 无论是游戏还是VR应用,内存管理都是其研发阶段的重中之重。 然而,在我们测评过...
  • UWA4D
  • UWA4D
  • 2016年12月14日 18:45
  • 5052

Unity内存优化方案集合

https://github.com/mc-gulu/dev-awesomenesses/blob/master/unity-gc-cheatsheet-references.md ...
  • wxlguitar
  • wxlguitar
  • 2017年09月07日 10:42
  • 97

【Unity优化】Unity优化技巧进阶(持续更新中...)

关于Unity中的Foreach这个话题,网络上讨论的很多,我也收集了一些资料,都不是很齐全,所以自己亲自测试,这里把结果分享给大家。foreach究竟怎么了?研究过这个问题的人都应该知道,就是它会引...
  • AndrewFan
  • AndrewFan
  • 2017年03月01日 11:23
  • 3018

Unity3D游戏优化方案

浅谈Unity3D项目优化 作为一个入行不足三年的攻城狮来讲,讲引擎中的优化,经验确实不足,unity3D引擎作为一款侧重移动端游戏开发引擎来讲,优化游戏是确实有必要的,毕竟他要适配所有机型的前提下...
  • BoBoWang1991
  • BoBoWang1991
  • 2017年04月03日 14:49
  • 953

Unity性能优化(主要是内存的优化)

Unity手游的性能优化过程更像是一门时空转换的艺术, 持续在CPU和内存之间取得一个平衡。空间不足时则需要释放一些无用数据,以获得更优的空间使用率;时间太长时就需要降低不必要的函数开销。以下是腾讯游...
  • u010377179
  • u010377179
  • 2016年10月25日 15:17
  • 2495
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unity3d优化之路
举报原因:
原因补充:

(最多只允许输入30个字)