gpt4 book ai didi

带有 AoT 编译器和对象池的 Protobuf-net

转载 作者:行者123 更新时间:2023-12-02 02:56:46 26 4
gpt4 key购买 nike

我一直在调查是否有人找到任何文档或弄清楚如何让对象池与 AoT 编译(这是 iOS 和 WebGL for Unity 所必需的)一起工作。

我找到了 this answer来自 Marc Gravell here,它描述了如何让工厂使用您的对象池,但如果您使用 AoT 预编译器并调用如下代码,这似乎不起作用:

 public static T DeserializeProtoObject<T>(byte[] bytes)
{
using (MemoryStream m = new MemoryStream(bytes))
{
return (T)m_serializer.DeserializeWithLengthPrefix(m, null, typeof(T),ProtoBuf.PrefixStyle.Fixed32,0);
}
}

其中 m_serializer 是通过预编译器使用如下代码创建的:

        var model = TypeModel.Create();
model.Add(typeof(PlayerUpdate), true);
model.AllowParseableTypes = true;
model.AutoAddMissingTypes = true;
model.Compile("IOGameProtoBufSerializer", "IOGameProtoBufSerializer.dll");

看起来 模型有一个 SetDefaultFactory() 函数,但我不确定如何使用它。知情人士有什么提示吗?

我的下一步是下载源代码并深入挖掘。

感谢您的帮助。

编辑: 看起来我在从此处下载完整的 protobuf-net 存储库后找到了示例源:https://github.com/mgravell/protobuf-net

对于那些想做同样事情的人,这里是显示如何使用默认构造函数的示例的实际源代码:

using Xunit;
using ProtoBuf;
using ProtoBuf.Meta;
using System;
using System.Threading;
using System.Reflection;
namespace Examples.Issues
{

public class SO14532116
{
[Fact]
public void Execute()
{

var model = TypeModel.Create();
model.AutoCompile = false;
model.SetDefaultFactory(typeof(SO14532116).GetMethod("ObjectMaker"));

int oldCount = Count;
Test(model, "Runtime");
model.CompileInPlace();
Test(model, "CompileInPlace");
Test(model.Compile(), "CompileInPlace");
model.Compile("SO14532116", "SO14532116.dll");
PEVerify.AssertValid("SO14532116.dll");

int newCount = Count;
Assert.Equal(oldCount + 3, newCount);
}

[ProtoContract]
public class Foo
{
[ProtoMember(1)]
public int X {get;set;}

public static Foo Create(int x = 0)
{
return new Foo(x);
}

public Foo(int x) { X = x; }
}


private void Test(TypeModel model, string p)
{
var obj = Foo.Create(123);

int oldCount = Count;
var clone = (Foo)model.DeepClone(obj);
int newCount = Count;
Assert.Equal(oldCount + 1, newCount);
Assert.Equal(123, clone.X);
}

private static int count;
public static int Count
{
get { return Interlocked.CompareExchange(ref count, 0, 0); }
}
public static object ObjectMaker(Type type)
{
object obj;
if(type == typeof(Foo))
{
obj = Foo.Create();
} else {
obj = Activator.CreateInstance(type);
}
Interlocked.Increment(ref count);
return obj;

}
}
}

最佳答案

预编译器……笨拙,几乎不可能支持 - 它在 2.3 中几乎不存在,下一个里程碑的关键交付是用构建时代码生成完全取代它,这是2.3 从重写模式工具开始。长期:这应该是一个好得多的选择!

可以查看如何使用 SetDefaultFactory 的示例 here .我无法预料这将如何与预编译器一起工作——如果它能工作:太棒了!

关于带有 AoT 编译器和对象池的 Protobuf-net,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48913231/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com