【Unity】数据存储

直接列出测试数据:

加载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(); // 0.26s
// LoadMonsters().Forget(); // 0.57s
// LoadJson().Forget(); // 0.1s
}

private async UniTaskVoid LoadMonsterUtil()
{
await Addressables.LoadAssetAsync<monsterUtil>("Assets/_Project/ScriptableObject/Excel/monster/_monsterUtil.asset");
Debug.Log($"加载MonsterUtil成功{Time.time}");
}

  • 加载时间:0.33s
  • 资产大小:共172kb

直接加载所有的ScriptableObject对象

1
2
3
4
5
6
7
8
9
10
11
12
13
private void Start()
{
Debug.Log($"start time: {Time.time}");
// LoadMonsterUtil().Forget(); // 0.26s
LoadMonsters().Forget(); // 0.57s
// LoadJson().Forget(); // 0.1s
}

private async UniTaskVoid LoadMonsters()
{
await Addressables.LoadAssetsAsync<monster>("monster", null);
Debug.Log($"加载Monster成功{Time.time}");
}

  • 加载时间:1.56s
  • 资产大小:共128kb

加载Json文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private void Start()
{
Debug.Log($"start time: {Time.time}");
// LoadMonsterUtil().Forget(); // 0.26s
// LoadMonsters().Forget(); // 0.57s
LoadJson().Forget(); // 0.1s
}
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}");
}

  • 加载时间:0.21s
  • 资产大小:33kb

加载普通类型的集合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}");
// LoadMonsterUtil().Forget(); // 0.26s
// LoadMonsters().Forget(); // 0.57s
// LoadJson().Forget(); // 0.1s
LoadMonsterUtil2().Forget();
}

private async UniTaskVoid LoadMonsterUtil2()
{
await Addressables.LoadAssetAsync<monsterUtil>("Assets/_Project/ScriptableObject/Excel/monsterUtil.asset");
Debug.Log($"加载MonsterUtil2成功{Time.time}");
}

  • 加载时间:0.45s
  • 资产大小:63kb

结论:

可以看出,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

结论

在游戏成为正式版之后,启动速度将会极大加快