Unity3d优化之路
来源:互联网 发布:优秀的python开源项目 编辑:程序博客网 时间:2024/05/04 04:38
Unity3d优化之路
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%的其他人,你就没有机会功成名就。
- Unity3d优化之路
- Unity3d优化之路
- Unity3d优化之路
- Unity3d优化之路
- Unity3d优化之路
- Unity3D 优化之路(一):DrawCall
- Unity3d之性能优化
- Unity3D优化之缓存
- Unity3D开发之Unity3D性能优化总结
- 游戏开发优化之路 之 Unity3D 渲染统计窗口
- 游戏开发优化之路 之 Unity3D 渲染统计窗口
- 游戏开发优化之路 之 Unity3D 渲染统计窗口
- unity3d 性能优化之prafab
- Unity3D开发之性能优化
- Unity3D优化之合并网格
- unity3d 研究之 性能优化
- Unity3D之NGUI的优化
- Unity3d 代码优化之Update
- 数据结构_查找二叉树中值为key的节点,并将指针指向该节点_C语言源代码
- linux问题
- 接口 Iterator<E> 与 接口 Iterable<T>
- Unity3D–Texture图片空间和内存占用分析
- unix与linux的区别
- Unity3d优化之路
- Linux-C高级编程(1)文件操作(一)
- Unity PlayerPrefer
- Android 百度地图 SDK v3.0.0 (一)
- 批量修改Texture属性 两种方式加载贴图,通过Resources.LoadAll Directoy 获取项目路径:Application.dataPath; using UnityEn
- 1007. Maximum Subsequence Sum (25)
- Afaria服务器为Windows Mobile设备添加注册表数据
- 【Unity】技巧集合
- java无重集合Set<T>与迭代器Iterator<T>