feat(network)!: add v2 framing, pooled buffers and bounded dispatch
This commit is contained in:
@@ -0,0 +1,9 @@
|
||||
# Generated MessagePack adapter
|
||||
|
||||
独立可选包。Unity 先安装 MessagePack-CSharp 3.1.8(含其生成器及依赖),再通过 UPM 引用本目录。此目录放在 `Adapters~` 下,不让未安装 MessagePack 的项目产生缺失程序集错误。.NET 使用 `ShrinkSDK.Network.MessagePack`。
|
||||
|
||||
消息使用 `[MessagePackObject]`、稳定 `[Key(n)]` 和生成的 resolver。构造 `ShrinkNetwork.MessagePack.ShrinkMessagePackNetworkSerializer` 时显式传入 resolver,再为每个消息调用 `Register<T>()`。未注册或没有 formatter 的类型明确报错;不回退到 Contractless/动态 IL/反射调用。
|
||||
|
||||
在绑定 transport 前注册;停止使用相关消息后才能撤回 codec。共享合同不能依赖 Unity 对象或引擎专属类型。双方必须使用相同合同与消息编码。
|
||||
|
||||
可编译示例与生成式互通测试:Workspace `Tools/AgentSupport/RuntimeTests/NetworkCodecTests.cs`。
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2ad6cd0d17394435bfb2d7bc04e78c0a
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b29018215be842d782c6e5b4fc53cf7e
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,47 @@
|
||||
#nullable enable
|
||||
using System;
|
||||
using System.Buffers;
|
||||
using MessagePack;
|
||||
using MessagePack.Formatters;
|
||||
|
||||
namespace ShrinkNetwork.MessagePack
|
||||
{
|
||||
/// <summary>Pass a generated-only resolver; register all message types before starting transports.</summary>
|
||||
public sealed class ShrinkMessagePackNetworkSerializer : ShrinkRegisteredNetworkSerializer
|
||||
{
|
||||
private readonly MessagePackSerializerOptions _options;
|
||||
public ShrinkMessagePackNetworkSerializer(IFormatterResolver generatedResolver)
|
||||
{
|
||||
_options = MessagePackSerializerOptions.Standard
|
||||
.WithResolver(global::MessagePack.Resolvers.CompositeResolver.Create(
|
||||
generatedResolver ?? throw new ArgumentNullException(nameof(generatedResolver)),
|
||||
global::MessagePack.Resolvers.BuiltinResolver.Instance))
|
||||
.WithSecurity(MessagePackSecurity.UntrustedData);
|
||||
}
|
||||
public void Register<T>() => Register(new FormatterCodec<T>(_options));
|
||||
|
||||
private sealed class FormatterCodec<T> : IShrinkMessageCodec<T>
|
||||
{
|
||||
private readonly IMessagePackFormatter<T> _formatter;
|
||||
private readonly MessagePackSerializerOptions _options;
|
||||
public FormatterCodec(MessagePackSerializerOptions options)
|
||||
{
|
||||
_options = options;
|
||||
_formatter = options.Resolver.GetFormatter<T>() ?? throw new InvalidOperationException($"No generated MessagePack formatter for {typeof(T).FullName}.");
|
||||
}
|
||||
public void Write(IBufferWriter<byte> buffer, T value)
|
||||
{
|
||||
var writer = new MessagePackWriter(buffer);
|
||||
_formatter.Serialize(ref writer, value, _options);
|
||||
writer.Flush();
|
||||
}
|
||||
public T Read(ReadOnlyMemory<byte> payload)
|
||||
{
|
||||
var reader = new MessagePackReader(payload);
|
||||
var result = _formatter.Deserialize(ref reader, _options);
|
||||
if (!reader.End) throw new System.IO.InvalidDataException("Trailing MessagePack payload.");
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c8394ccb85a14b23b66d1c9ec3a40dc3
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"name": "ShrinkNetwork.MessagePack",
|
||||
"references": ["ShrinkNetwork.Runtime"],
|
||||
"autoReferenced": true,
|
||||
"noEngineReferences": true
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 74898e5de85247f6b0228c06ee3bdf6e
|
||||
AssemblyDefinitionImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,15 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netstandard2.1</TargetFramework>
|
||||
<LangVersion>latest</LangVersion>
|
||||
<Nullable>enable</Nullable>
|
||||
<PackageId>ShrinkSDK.Network.MessagePack</PackageId>
|
||||
<Version>0.1.0</Version>
|
||||
<EnableDefaultCompileItems>false</EnableDefaultCompileItems>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Runtime/**/*.cs" />
|
||||
<PackageReference Include="MessagePack" Version="3.1.8" />
|
||||
<PackageReference Include="ShrinkSDK.Network" Version="0.4.2" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"name": "com.cneicy.shrink-network-messagepack",
|
||||
"version": "0.1.0",
|
||||
"displayName": "Shrink Network MessagePack",
|
||||
"description": "Explicit generated MessagePack codecs for ShrinkNetwork protocol v2. Requires MessagePack-CSharp 3.1.8.",
|
||||
"unity": "2022.3",
|
||||
"dependencies": {
|
||||
"com.cneicy.shrink-network": "0.4.2"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7e1dd2e113fe4a74b6afe398b315db86
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user