本文共 2158 字,大约阅读时间需要 7 分钟。
Q1:有没有什么办法可以提升Unity编辑器中代码的编译速度?我们现在每修改一次代码,等待的编译时间都将近半分钟。
对于大型项目来说,这确实是大家经常遇到的情况。一般来说,Unity Editor会按照脚本的依赖关系编译代码,其主要分为以下四个步骤:
- 编译Standard Assets、Pro Standard Assets和Plugins文件夹中的Runtime Script;
- 编译以上三个文件夹中Editor文件夹下的Script;
- 编译项目中所有剩余的Runtime Script(Editor文件夹以外Script;
- 编译剩余Script(即Editor文件夹中Script)。
知道了Unity编辑器的脚本编译特性后,我们则建议研发团队可以将一些长时间不需要改动的脚本代码(比如各种插件代码)放入到Standard Assets、Pro Standard Assets或Plugins文件夹中,这样这些代码只需要编译一次,后续的时间就都能节省下来。有朋友做过测试,在他们的项目中经过上面的改动,原来项目每次的编译时间从23s下降到7s。想想看,这将节省你和你的团队多少时间!
推荐插件:Mad Compile Time Optimizer (https://www.assetstore.unity3d.com/en/#!/content/34012) 推荐阅读:http://qiankanglai.me/2016/11/27/unity-compiler/
Q2:关于UI开发,NGUI和UGUI究竟哪个性能更好呢?
从理论上来说,没有什么依据可以证明UGUI的性能一定比NGUI更优异。在UWA的测评报告中,对于NGUI来说,主要统计UIPanel.LateUpdate\UICamera.Update\UIRect.Update和UIRect.Start;对于UGUI来说,主要统计Canvas.BuildBatch和Canvas.SendwillRenderCanvases。相对于NGUI来看,UGUI确实在以下方面存在提升性能的可能:首先,在Unity 5.x 版本中,Unity逐渐将一部分UGUI的计算放到子线程去做,以此来缓解主线程的压力;其次,UGUI的UIMesh重建是通过底层C++代码实现的,而NGUI只能通过在上层不断创建vertex list来进行,这样在堆内存的管理上,UGUI确实要好很多,带来的隐性收益就是GC触发次数会少很多。但不能表示NGUI做出来的UI性能就一定比UGUI差,这个说法是不存在的。而且,在我们深度优化的过程中发现,NGUI同样可以达到很高的性能水准。所以,NGUI和UGUI都是很好的工具,只要把它们的特性掌握好,都可以做成性能很棒的UI界面。
Q3:目前所遇到的问题是在UGUI下,无法使用ECT+Alpha分离,函数中已经设置了,但是实际打出来的包并不能显示。我们所使用的Unity版本为5.4.1f,所以特此请教一下是否哪些地方我们使用的不对。
目前看下来,这很可能由Unity的Bug所致: 在对开启了 Compress using ETC1 的选项的Sprite类型的纹理打包时,不会将其对应的Shader(UI/DefaultETC1)打入包内,造成真机运行时Shader丢失,看上去变成紫红色。
解决的方法: 在 Edit->Project Settings->Graphics 的 Always Included Shaders 中加入 UI/DefaultETC1 即可。我们测试用的是 5.4.3f1,所以升级版本应该暂时解决不了。
Q4:下图中WWW.LoadFromCacheOrDownload第三个参数是用来验证资源的吗? 感觉跟第二个参数有点相似(除了验证以外), WWW.LoadFromCacheOrDownload在iOS上是否有数量限制?
第三个参数是与资源的验证有关,如果crc值不匹配则需要重新下载或者报错,这与第二个参数并不相同,第二个参数主要用来管理版本更新,通过参数的更改,使得客户端及时更新Cache中缓存的AsseBundle数据。iOS上在Unity 4.x的版本中,通过该接口加载,且同时存在于内存中的AssetBundle数量确实是有限的,接近300个,这是由iOS上文件句柄数的限制导致,而在Unity 5.x 中,由于引入了虚拟文件系统,则不再有这个限制。
Q5:WWW.LoadFromCacheOrDownload只是在内存中有个引用,没有实际加载资源,调用WWW.assetbundle后也是么? 那么依赖此AssetBundle的资源加载的时候,会自动触发此AssetBundle从磁盘加载对应的引用资源么?
原文出处:侑虎科技 本文作者:admin 转载请与作者联系,同时请务必标明文章原始出处和原文链接及本声明。在调用WWW.assetBundle之后,内存中也只是存在较小的SerializedFile(不包含资源数据)。“那么依赖此AB的资源加载的时候”确实会触发该AssetBundle通过磁盘IO加载资源。