相信很多使用Unity的小伙伴都据说过,甚至也亲身经历过在Unity5.6最初的几个版本中使用Resources.Load方法加载资源变~~慢的问题。
这个问题的确是存在的,好比这个issue中提到的:
android-performance-regression-when-loading-a-prefab-with-a-lot-of-child-objects-using-resources-dot-loadhtml
因此为了验证问题并思考是否有解决方案,我也实现了相似这个issue中提到的测试场景,而且分别在Unity5.6.1f1版本和Unity5.6.4p1版本上进行了测试对比,至于为什么选择这2个版本下文再说。android
这个场景比较简单,主要是在Resources文件夹下建立了一个有不少(650+)子节点的prefab,而且在运行时经过点击按钮调用Resources.Load进行资源加载。编程
而个人测试设备则是几年前的MI Note Pro。工具
测试场景和测试设备都准备就绪了,接下来咱们就直接在Unity5.6.1f1上进行安卓包的构建吧,同时直接连上profiler进行数据抓取。
不过这一测没关系,果真能够发现这个版本的Unity在调用Resources.Load加载资源的效率很低。大概要耗时1700ms!测试
等等,冷静一下,回想一下既然是加载Resources文件夹内的资源,那么Resources文件夹有什么特色吗?对,它会随工程一同打包。也就是说在打包的过程当中它会通过aapt这个工具的处理啊。那么aapt是什么呢?看它的全称——Android Asset Packaging Tool,安卓资源打包工具啊。那么可否经过修改aapt的参数来改善加载Resources文件夹内的资源效率的问题呢?gradle
想到这里,吓得我立马导出了一个gradle工程。
打开build.gradle文件查看一下,嗯这里没有设置aapt的相关参数。
ui
因此我来手动加上对aapt的设置吧:3d
aaptOptions { noCompress '.unity3d', '.ress', '.resource', '.obb' }
ok,此次咱们经过Android Studio来导出一个安卓包。而且连上设备进行测试。
code
结果让人稍感欣慰,耗时已经从以前的1700ms来到了300ms。orm
因此,修改aapt的压缩策略对Resources文件夹内的资源是有效果。
好了,咱们接下来使用另外一个Unity版本——5.6.4p1来进行测试。
此次不导出gradle工程,直接使用Unity来打包。
wow~测试的结果亮瞎双眼。居然只须要50ms!(考虑到个人测试场景很凶残,设备很简陋,从1700+ms来到50ms仍是很大的跃升吧)。
这是为何呢?
答案很简单,由于咱们fix了这个问题啊。而这也是我选择这个版本进行测试的缘由啊。
因此,若是还在对江湖传闻中5.6版本的Resources.Load效率变态的低感到恐惧的话,就赶快升级Unity版本吧。固然,做为最佳实践之一,尽可能减小使用Resources也是不错的选择。
-EOF-
最后打个广告,欢迎支持个人书《Unity 3D脚本编程》
欢迎你们关注个人公众号慕容的游戏编程:chenjd01