技术分享连载(四十三)

技术分享连载(四十三)

本期话题:提升Unity编辑器中代码的编译速度、NGUI和UGUI究竟哪个性能更好、在UGUI下,无法使用ECT+Alpha分离...精选5个性能优化问题,建议阅读时间15分钟,认真读完必有收获。如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。

UWA QQ群:793972859


资源管理

Q1:有没有什么办法可以提升Unity编辑器中代码的编译速度?我们现在每修改一次代码,等待的编译时间都将近半分钟。

对于大型项目来说,这确实是大家经常遇到的情况。一般来说,Unity Editor会按照脚本的依赖关系编译代码,其主要分为以下四个步骤:

  1. 编译Standard Assets、Pro Standard Assets和Plugins文件夹中的Runtime Script;
  2. 编译以上三个文件夹中Editor文件夹下的Script;
  3. 编译项目中所有剩余的Runtime Script(Editor文件夹以外Script;
  4. 编译剩余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/


UI 输入

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从磁盘加载对应的引用资源么?

在调用WWW.assetBundle之后,内存中也只是存在较小的SerializedFile(不包含资源数据)。“那么依赖此AB的资源加载的时候”确实会触发该AssetBundle通过磁盘IO加载资源。

今天的分享就到这里。也欢迎热爱进步的你加入UWA的QQ群(793972859),也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。 比起闭门造车,我们更乐意与大家各抒己见,畅所欲言;比起形而上的泛泛而谈,我们更乐意与大家直击痛点,对症下药。

  • 高松 发表在 2017年01月10日 回复

    Q1回答的第2条 编译以上三个文件夹中Editor文件夹下的Script;
    这里有个小坑,它并不是编译Standard Assets文件夹下所有的Editor,文件夹下的Script,它只是编译Standard Assets文件夹下顶级Editor文件夹下的所有Script
    原文:https://docs.unity3d.com/Manual/ScriptCompileOrderFolders.html,
    Phase 2: Editor scripts in folders called Editor that are anywhere inside top-level folders called Standard Assets, Pro Standard Assets and Plugins.

    而且我测试过,如果相关插件Editor不在顶级的话,出包时候会报"Error building Player because scripts had compiler errors"

    • 高松 发表在 2017年01月10日 回复

      环境是Unity4.7.2