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 ...
随机推荐
- IoC容器的初始化过程
1.简单来说,IoC容器的初始化是由前面介绍的refresh()方法来启动的,这个方法标志着IoC容器的正式启动. 2.具体来说,这个启动包括BeanDefinition的Resource定位.载入和 ...
- 数据库设计(字段)中的char、varchar、text和nchar、nvarchar、ntext的区别
char.varchar.text和nchar.nvarchar.ntext的区别 1.CHAR.CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数 ...
- 如何查找在CDN下的真实ip
今天去找了一下www.bilibili.tv的IP(为什么要这样子做见),发现www.bilibili.tv使用了CDN服务直接ping找不到其真实IP(实际上不用找也可以但就是想找一下). 那我们应 ...
- 【风马一族_Android】Android 前端内容1
Android 前端内容 4.1 View 类概述 4.1.1 关于 View //类型说明 view(视图)指的是用户界面组件的基本构建基块.一个视图占据屏幕上的矩形区域,负责绘图和事件处理.视图是 ...
- CentOS 6.X安装LAMP最高版本环境
#------------CentOS .X安装LAMP最高版本环境------------------ #! /bin/sh #安装Apache yum install httpd -y #.关 ...
- win7 IIS 7.5 HTTP 错误 404.3 - Not Found
HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面.如果该页面是脚本,请添加处理程序.如果应下载文件,请添加 MIME 映射. 解决这个问题你只需要,打开控制面 ...
- 微信小程序视频地址
微信小程序视频系列教程完整版,课程中用到的源码附在帖子最后. [url=http://bbs.larkapp.com/forum.php?mod=viewthread&tid=5673][b] ...
- How to begin Python learning?
如何开始Python语言学习? 1. 先了解它,Wiki百科:http://zh.wikipedia.org/zh-cn/Python 2. Python, Ruby等语言来自开源社区,社区的学法是V ...
- c#中的类型转换
Parse类型转换 Parse()函数 int.double都能调用Parse()函数,Parse(string str);如果转换成功就成功,失败就会抛出一个异常; TryParse()函数 相应地 ...
- WPF自定义控件(三)——Window
一样!先来看看效果吧: 怎么样?效果很好吧,而且不只是样式哟!所有系统窗体有的交互操作都可以实现! 但可惜...有很多和系统API有关的东西本人了解得并不多,所以这个窗体是基于他人的成果上产生的.关于 ...