当前位置: 首页 > web >正文

Unity3D中Newtonsoft.Json序列化优化策略

前言

在Unity3D中使用Newtonsoft.Json(http://Json.NET)进行序列化时,可以通过以下策略进行优化,提升性能和减少内存开销:

对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀!

1. 避免重复创建序列化设置

每次序列化都创建新的 JsonSerializerSettings 会产生GC开销。推荐缓存设置

private static readonly JsonSerializerSettings _settings = new JsonSerializerSettings {ReferenceLoopHandling = ReferenceLoopHandling.Ignore, // 忽略循环引用NullValueHandling = NullValueHandling.Ignore,         // 忽略null值DefaultValueHandling = DefaultValueHandling.Ignore,   // 忽略默认值Formatting = Formatting.None                          // 无格式化(最小体积)
};// 使用缓存设置
string json = JsonConvert.SerializeObject(obj, _settings);

2. 使用流式API处理大文件

直接读写文件流,避免一次性加载大JSON字符串:

// 序列化到文件
using (StreamWriter sw = new StreamWriter("data.json"))
using (JsonWriter writer = new JsonTextWriter(sw)) {JsonSerializer.CreateDefault(_settings).Serialize(writer, data);
}// 从文件反序列化
using (StreamReader sr = new StreamReader("data.json"))
using (JsonReader reader = new JsonTextReader(sr)) {var data = JsonSerializer.CreateDefault(_settings).Deserialize<MyDataType>(reader);
}

3. 减少序列化数据量

  • 选择性序列化:使用 [JsonIgnore] 标记不需要的属性:
public class PlayerData {public string Name { get; set; }[JsonIgnore]public Vector3 Position; // Unity类型默认不支持,需自定义Converter
}

自定义ContractResolver:动态控制序列化字段:

public class IgnoreVectorResolver : DefaultContractResolver {protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) {JsonProperty property = base.CreateProperty(member, memberSerialization);if (property.PropertyType == typeof(Vector3)) {property.ShouldSerialize = _ => false; // 跳过所有Vector3}return property;}
}// 使用
_settings.ContractResolver = new IgnoreVectorResolver();

4. 为Unity类型编写自定义Converter

Newtonsoft默认不支持Unity的 Vector3、Color 等类型。自定义Converter示例:
public class Vector3Converter : JsonConverter<Vector3> {public override void WriteJson(JsonWriter writer, Vector3 value, JsonSerializer serializer) {writer.WriteStartArray();writer.WriteValue(value.x);writer.WriteValue(value.y);writer.WriteValue(value.z);writer.WriteEndArray();}public override Vector3 ReadJson(JsonReader reader, Type objectType, Vector3 existingValue, bool hasExistingValue, JsonSerializer serializer) {float[] array = serializer.Deserialize<float[]>(reader);return new Vector3(array[0], array[1], array[2]);}
}// 注册Converter
_settings.Converters.Add(new Vector3Converter());

5. 优化序列化深度和复杂对象

  • 限制最大深度(防堆栈溢出):

_settings.MaxDepth = 64; // 根据需求调整

拆分复杂对象:将大对象拆分为多个子对象分别序列化。

6. 预编译序列化器(AOT平台)

针对IL2CPP(如iOS):避免AOT编译错误并提升性能:

  1. 生成预编译序列化器:
// 在Editor中运行此代码生成
var myTypes = new[] { typeof(PlayerData), typeof(Inventory) /* 其他类型 */ };
var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto 
};
Newtonsoft.Json.Utilities.AotHelper.EnsureList(myTypes); // 触发预编译

将生成的 Newtonsoft.Json_*.dll 放入Plugins目录。

7. 性能关键代码使用StringBuilder

高频小对象序列化时,用 StringBuilder 减少字符串拼接开销:

StringBuilder sb = new StringBuilder(256); // 预分配内存
using (StringWriter sw = new StringWriter(sb))
using (JsonWriter writer = new JsonTextWriter(sw)) {JsonSerializer.CreateDefault(_settings).Serialize(writer, obj);
}
string json = sb.ToString();

8. 避免频繁序列化

  • 增量更新:只序列化变化的部分(如使用JSON Patch)。
  • 对象池:复用反序列化后的对象。

9. 替代方案:System.Text.Json(Unity 2021.2+)

如果项目允许,切换到Unity支持的 System.Text.Json(性能更高,GC更低):

using System.Text.Json;string json = JsonSerializer.Serialize(obj, new JsonSerializerOptions {IgnoreNullValues = true,WriteIndented = false
});

关键注意事项

  1. 循环引用:确保设置 ReferenceLoopHandling.Ignore
  2. Unity版本兼容
  • Newtonsoft需通过Package Manager安装(包名:com.unity.nuget.newtonsoft-json)。
  • 旧版本Unity需手动导入 .dll
  • IL2CPP问题:提前测试AOT平台,使用预编译序列化器。

通过以上优化,可显著降低序列化开销(尤其是GC和CPU耗时),特别适合移动设备或高频序列化场景(如网络通信、存档系统)。

更多教学视频

Unity3D​www.bycwedu.com/promotion_channels/2146264125

http://www.xdnf.cn/news/12253.html

相关文章:

  • [蓝桥杯]倍数问题
  • 倍福 PLC程序解读
  • kubectl 命令
  • docker 搭建php 开发环境 添加扩展redis、swoole、xdebug(2)
  • 游戏设计模式 - 子类沙箱
  • 计算机网络备忘录
  • SDC命令详解:使用set_fanout_load命令进行约束
  • AI Agent 项目 SUNA 部署环境搭建 - 基于 MSYS2 的 Poetry+Python3.11 虚拟环境
  • 鸿蒙jsonToArkTS_工具exe版本来了
  • 上门服务小程序会员系统框架设计
  • 鸿蒙UI(ArkUI-方舟UI框架)- 使用弹框
  • 【react+antd+vite】优雅的引入svg和阿里巴巴图标
  • 八、Python模块、包
  • 华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
  • linux systemd 服务配置
  • 基础线性代数
  • Android协程学习
  • GPU加速与非加速的深度学习张量计算对比Demo,使用PyTorch展示关键差异
  • 面试总结一
  • 微服务架构下的服务注册与发现:Eureka 深度解析
  • Dify源码教程:账户和密码传递分析
  • 十六进制数字接收的方式
  • Linux程序运行日志总结
  • 面试题:SQL 中如何将 多行合并为一行(合并行数据为列)?
  • 第46节:多模态分类(图像+文本)
  • 学习路之PHP--webman安装及使用
  • 11.MySQL事务管理详解
  • 十八、【用户认证篇】安全第一步:基于 JWT 的前后端分离认证方案
  • 物流瘫痪预警:亚马逊多仓爆仓,卖家如何抢占夏季性价比市场?
  • 【Android基础回顾】五:AMS(Activity Manager Service)