Unity3D 优化相关
抛砖引玉:
http://www.luzexi.com/unity3d%E4%BC%98%E5%8C%96%E4%B9%8B%E8%B7%AF/
关于图片
一、Unity3D自身会把导入的图片进行压缩,这些压缩不仅体现在内存上,而且也体现在包大小。
测试如下,相同的图片,压缩后的大小:
打包的大小分别对应如下:可以看到差别很大。
2014-12-30:
这里貌似 有个 误解:
我重新做了 这个 实验,1024 * 1024 RGBA 32 png 图片 与 1024 * 1024 RGB 8 jpg 图片 分别对应 不同的 压缩格式 并且 压缩的大小也不同。但是出来的包竟然神奇的是一样的。我无语了…………上图


二、如果一堆PreFab,被多个场景静态引用,和被多个场景动态引用,导出的大小差别不大。这里做个测试
根据图片顺序分别给出对应的包:可以看到,虽然有差别,但是不是很大,估计是静态引用本身需要一些资源吧。
三、图片不引用则不会加到包里
如果你加了一堆图片进到工程中,如果你对其不引用,那么你的的图片就不会加到工程中,必须要在这里吐槽一点,Unity3D就算一个空白工程也会有一个7M的APK,表示无语。
没有任何图片资源的工程

有图片资源的工程

关于脚本
一、有时候你打开一个按钮,弹出一个界面预设,如果这个界面携带很多资源,那么在生成的时候就会有点慢,这样给用户的感觉就是按下按钮 过了一会才会弹出那个界面。
这种情况需要异步加载,使用协程,最好不要自己使用协程加载界面,因为自己使用协程的话,那么只能在最后Destroy 自己,不然自己销毁后协程就消失了。
这样一来有两个问题。
一、在最后destroy 的之前,你 需要 额外做一段动画 来 保证与用户的交互。不然用户按下之后,你开着协程生成界面,自己又不消失,交互很不好。
二、
我们看这一段代码
public GameObject go;
float curTime;
IEnumerator Test()
{
curTime = Time.realtimeSinceStartup;
GameObject newgo = Instantiate(go) as GameObject;
float delta = Time.realtimeSinceStartup - curTime;
Debug.Log("Instantiate Use Time : " + delta);
yield return new WaitForSeconds(0.3f);
Destroy(transform.root.gameObject);
}
void OnDestroy()
{
Debug.Log("OnDestroy" + transform.name);
}
void OnGUI()
{
if (GUI.Button(new Rect(, , , ), "I am a button")) StartCoroutine(Test());
}
相信我们都很清楚u3d 事件调用序列顺序,我们可以看到Instantiate 的时候 会把这个 生成物体 下的 Awake OnEnable 全部 执行一遍。
并且 原物体 的Destroy 是会在下一个轮回中进行的,是在 新生成物体 的Start之后。
这样一来,如果 原物体 是UIRoot的话,UIRoot 有一个
static public List<UIRoot> list = new List<UIRoot>(); 在新物体生成时候 list保存了 原物体 与 新物体 的两个UIRoot的引用。
list 在 新物体 Start 的时候进行 会全部 进行 scale 调整。
这个scale 调整是会把 原物体 与 新物体 都调整一遍,如果你的 新物体 生成比较快 并且 调用了 yield return new waitforseconds 之后才 销毁 原物体 , 你就会发现 原物体 卡一下的情况(因为此时还没有真正Destroy)。
2015-1-13 如果 每次 OnEnable 的时候 return, list 永远是空的。这个 时候 第二个UIROOT生成 如果此时第一个UIROOt 还没有销毁的话 还是会出现卡一下的情况,看来不是list的问题。
当然也可以因为 界面生成 花费的时间长,这样一来可能新物体 uiroot start 的 时刻 已经 超过了 yield return new waitforseconds 的 时刻。 此时 原物体 已经 destroy 了。也就不会出现卡一下的 原因了。但是这个时间不好掌握,所以还是不推荐了。
当然你也可以说干嘛不干脆一个 UIRoot 算了,原物体 与 新物体 都是这个一个 UIRoot 的子物体不就没事了。没错,这样一来是可以的,但是还没有解决第一个问题。

看到上述 2个 原因,那么我们可以明白 原物体 不能在最后 destroy 自己。可是又要使用协程,那么 我们就使用一个专门的UIManager 类来进行协程管理生成UI, 这里 UIManager 负责所有的 UI 物体的 生成 与 销毁。 先 Destroy 原物体, 再 开协程 一个个生成 新UI。用户只会看到自己按下后界面消失,至于界面的产生慢0.几秒是感觉不到的,(你也可以做一个tween传入,让产生慢一点的界面快一会传入,产生快一点慢一点传入,让用户错觉是都是产生都是差不多的,只要速度接近就行了。)
当然最好 都是 UIRoot 的 子物体,这样防止 每一个 新UI 因为都携带一个 UIRoot ,start 的 时候 都会 导致 scale 重新调整一遍。
另外,我建议用缓冲机制 setActive 代替 instantiage/destroy .(第一次除外,必须要用instantiate),这样一来最好都是一个UIRoot 的子物体,不然父物体使用destroy ,而子物体使用setactive 就冲突了。如果 全局都是 一个UIRoot ,那么我们destroy 与 setactive 都是 那一个uiroot 的 子物体,不会引发冲突。
另外模块对其的调用也可以统一,其他模块只需要调用 UIManager 的 Create(UIId id) 这个接口就可以了。内部到底是缓冲机制 还是 destroy 完全由自己维护。
总结一下,就是两点,
一、最好就是一个UIRoot ,所有新的UI都是其子物体。
二、就是 大 界面的 生成,使用协程,但是 不要 自己 使用 协程,交给uimanager 管理,这样可以先销毁自己,再生成新的ui。
Unity3D 优化相关的更多相关文章
- Unity3D AssetBundle相关
Unity3D AssetBundle相关 首先,先看一下原理吧 Unity3D研究院之Assetbundle的原理(六十一) 其次,接着往下看:Unity3D研究院之Assetbundle的实战( ...
- js DOM优化相关探索
我在这尝试两个方面:-->DOM与js -->DOM与浏览器 (最近在秒味视频上学到不少,哈哈哈) 一.DOM与js 1.js与dom的交互问题 频繁的与dom交互,是一件浪费时间与金钱的 ...
- MySql性能优化相关
原来使用MySql处理的数据量比较少,小打小闹的,没有关注过性能的问题.最近要处理的数据量飙升,每天至少20W行的新增数据,导致MySql在性能方面已经是差到不可用的地步了,必须要重视MySql的优化 ...
- Mysql优化相关总结
Mysql优化相关总结 2016-05-31 数据库集中营 优化顺序: 选择适当的引擎和表结构和数据类型 建立索引,优化sql. 增加缓存,redis.memcache. 主从.主主,读写分离. my ...
- Web 前端性能优化相关内容解析
Web 前端性能优化相关内容,来源于<Google官方网页载入速度检测工具PageSpeed Insights 使用教程>一文中PageSpeed Insights 的相关说明.大家可以对 ...
- Web 前端性能优化相关内容解析[转]
Web 前端性能优化相关内容,来源于<Google官方网页载入速度检测工具PageSpeed Insights 使用教程>一文中PageSpeed Insights 的相关说明.大家可以对 ...
- Unity3d优化总结2
优化: 1. 更新不透明贴图的压缩格式为ETC 4bit,因为android市场的手机中的GPU有多种, 每家的GPU支持不同的压缩格式,但他们都兼容ETC格式, 2. 对于透明贴图,我们只能选择RG ...
- 【转载】总结使用Unity3D优化游戏运行性能的经验
流畅的游戏玩法来自流畅的帧率,而我们即将推出的动作平台游戏<Shadow Blade>已经将在标准iPhone和iPad设备上实现每秒60帧视为一个重要目标. 以下是我们在紧凑的优化过程中 ...
- SQL Server 查询性能优化 相关文章
来自: SQL Server 查询性能优化——堆表.碎片与索引(一) SQL Server 查询性能优化——堆表.碎片与索引(二) SQL Server 查询性能优化——覆盖索引(一) SQL Ser ...
随机推荐
- asp.net visio com接口 asp.net和visio混合编程
主要介绍asp.net调用visio com的基本用法,主要用于控制visio图形背景色,文字显示等. 主要步骤: 1. 项目中引用COM组件,找到Mircosoft Visio 14 Type Li ...
- js模版引擎Mustache介绍
Mustache通常被称为JavaScript模板的基础.另一个流行的解决方案Hanldebars实际上就是基于Mustache构建而成的.这并不意味着Mustache是一个不好的模板解决方案. 下面 ...
- js中字符和数组一些基本算法题
最近在刷 fcc的题,跟升级打怪一样,一关一关的过,还挺吸引我的.今天抽时间把 Basic Algorithm Scritping 这部分题做了,根据一些提示,还是比较简单的.有些题的处理方式 方法 ...
- NOIP 2015普及组复赛Day1 T1 == Codevs4510 神奇的幻方
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description: 幻方是一种很神奇的N∗N矩阵:它由数字 1,2,3, … … ,N∗N构成, ...
- java基础-浅复制与深复制的理解
浅复制与深复制在很多编程语言中都有出现,那么什么是浅复制,什么是深复制呢? 要区分浅复制与深复制,首先我们要明确什么是复制,怎样才算是复制.复制的例子在生活中也随处可见,如复印一份文档,复制一段文字等 ...
- C# 语言如何获取json格式的数据,不用javascript用c#实现。。。
{'state' : 1,'data':{'list':[{'id': 123, 'name': '诸葛天邪','level': 10,'country': 1,}]}} 比如我要获取里面的 id 该 ...
- WP开发笔记——字符串 转 MD5 加密
将字符串进行MD5加密,返回加密后的字符串. 从这里下载Md5.cs文件:http://pan.baidu.com/s/1hq3gpnu. 添加到Windows Phone 7项目中,在代码里面这样调 ...
- jdk、maven配置
JDK环境变量配置1.新建系统变量 1)变量名:JAVA_HOME 变量值:C:\Program Files\Java\jdk1.7.0_15 2)变量名:CLASSPATH 变量值:.;%JAVA_ ...
- ORA-14404
OS: Oracle Linux Server release 5.7 DB: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - ...
- MySQL创建复合索引
在MySQL数据库中,创建复合索引的时候,不知道在创建过程中哪个列在前面,哪个列该在后面,用以下方式即可: select count(distinct first_name)/count(*) as ...