直接列出测试数据:
加载ScriptableObject的集合ScriptableObject对象
monster为ScriptableObtjet类的子类
1 2 3 4 5 6 7 8 9 10 11 12 13
| private void Start() { Debug.Log($"start time: {Time.time}"); LoadMonsterUtil().Forget(); }
private async UniTaskVoid LoadMonsterUtil() { await Addressables.LoadAssetAsync<monsterUtil>("Assets/_Project/ScriptableObject/Excel/monster/_monsterUtil.asset"); Debug.Log($"加载MonsterUtil成功{Time.time}"); }
|

直接加载所有的ScriptableObject对象
1 2 3 4 5 6 7 8 9 10 11 12 13
| private void Start() { Debug.Log($"start time: {Time.time}"); LoadMonsters().Forget(); }
private async UniTaskVoid LoadMonsters() { await Addressables.LoadAssetsAsync<monster>("monster", null); Debug.Log($"加载Monster成功{Time.time}"); }
|

加载Json文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| private void Start() { Debug.Log($"start time: {Time.time}"); LoadJson().Forget(); } private async UniTaskVoid LoadJson() { var json = await Addressables.LoadAssetAsync<TextAsset>("Assets/TestData.json"); Debug.Log($"成功获取到json文件 {Time.time}"); var monsterUtil = JsonConvert.DeserializeObject<monsterUtil>(json.text); Debug.Log($"反序列化成功 {Time.time}"); }
|

加载普通类型的集合ScriptableObject对象
monster为普通的被Serializable
修饰的类
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| private void Start() { Debug.Log($"start time: {Time.time}"); LoadMonsterUtil2().Forget(); }
private async UniTaskVoid LoadMonsterUtil2() { await Addressables.LoadAssetAsync<monsterUtil>("Assets/_Project/ScriptableObject/Excel/monsterUtil.asset"); Debug.Log($"加载MonsterUtil2成功{Time.time}"); }
|

结论:
可以看出,json不管是加载时间还是资产大小都遥遥领先
但json无法在unity中直接存储Sprite等资产
如果确实需要引用unity中的Sprite等资产,可以使用集合ScriptableObject对象
- 如果注重时间,可以将子数据也写成ScriptableObject
- 如果注重大小,可以将子数据写成普通的被Serializable修饰的类
启动速度
在出现白屏到unity加载完毕的时间:
unity版本 |
游戏内容(开发/体验版) |
iphone15pm |
小米10 |
unity2021.3.20f1c1 |
空包 |
7.5s |
3.5s |
|
裸TEngine框架 |
7.4s |
4.5s |
unity2021.2.5f1c303 |
空包 |
6~8s |
4.7s |
|
守住这个城 |
7.6s |
6.3s |
以上数据都是开发版(体验版也是一样的),启动速度都至少需要7s
unity版本 |
游戏内容(正式版) |
inphone15pm |
小米10 |
unity2021.2.5f1c303 |
守住这个城 |
2.5s |
|
结论
在游戏成为正式版之后,启动速度将会极大加快