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