为何Unity从AssetBundle加载场景比从obb文件加载速度更快?
Unity 2018.4 Android平台场景加载耗时差异原因
核心差异原因
你观测到的3秒耗时差来自三种环节的额外开销,两种加载路径的逻辑完全不同:
从obb加载内置场景的完整链路(耗时6.6s)
- Unity 2018版本Android整包(apk+obb)的内置资源默认使用LZMA整体压缩,所有BuildSettings中添加的场景、资源都被打包在同一个连续压缩块内,存放在obb的
assets/bin/Data目录下 - 调用
SceneManager.LoadSceneAsync加载内置场景时,需要先寻址到obb文件中对应场景的偏移量,读取整个LZMA压缩块到内存完成全量解压,才能获取场景序列化数据,仅这一步的耗时就比AB加载的解压环节高2s左右 - 额外校验开销:内置场景属于整包构建资源,加载时Unity会额外执行整包资源依赖完整性校验,防止obb文件被篡改,该步骤在Android平台2018版本的固定开销约1s
- Unity 2018版本Android整包(apk+obb)的内置资源默认使用LZMA整体压缩,所有BuildSettings中添加的场景、资源都被打包在同一个连续压缩块内,存放在obb的
从AssetBundle加载场景的完整链路(耗时3.6s)
- 你使用的
ChunkBasedCompression为LZ4分片压缩,每个资源块独立压缩,加载场景时仅需要读取场景对应的分片数据完成解压,不需要处理AB包内其他资源的解压操作 - 不在BuildSettings中的AB场景不会触发整包资源的依赖校验,仅需要执行AB包本身的轻量校验,开销可以忽略
- 你提前加载对应AB的操作已经完成了场景元数据、依赖资源的预读取,调用
SceneManager.LoadSceneAsync时仅需要反序列化场景结构,省掉了内置场景加载时的IO寻址开销
- 你使用的
补充说明
如果要优化内置场景的加载速度,可以在PlayerSettings中将Android整包的压缩格式修改为LZ4,和AB的压缩格式对齐,可减少1.5-2s的解压耗时,但仍会比AB加载慢约0.5s,差值来自整包校验的固定开销。
内容的提问来源于stack exchange,提问作者ChingYu Kang
相关产品推荐
相关产品推荐

