针对 iOS 的 Unity3D 中的协议缓冲区

Posted

技术标签:

【中文标题】针对 iOS 的 Unity3D 中的协议缓冲区【英文标题】:ProtocolBuffer inside Unity3D targeting iOS 【发布时间】:2012-12-05 14:22:17 【问题描述】:

我正在尝试在针对 ios 设备的 Unity3D 项目中使用 Marc Gravell 的 protobuf-net C# 协议缓冲区实现。

我设法使用protogen从协议缓冲区文件MyFile.proto创建了一个C#文件(我们称之为MyFile.cs)。

一旦导入文件和protobuf-net.dll(我在unity文件夹中使用dll),我就可以成功反序列化以前序列化的文件(我正在从python代码进行序列化,一切正常):

MyType myType;
using (var file = File.OpenRead("Assets/MyTypeBin")) 

  myType = ProtoBuf.Serializer.Deserialize<MyType>(file) ;

上述解决方案在模拟器上运行良好,但在针对iOS 设备(es.ipad)时失败。

我试图从unity/protobuf-net.dll切换到CoreOnly/ios/protobuf-net.dll,但最后一个编译失败。似乎Deserialize方法没有在核心dll中声明:

错误 CS0117:ProtoBuf.Serializer' does not contain a definition for Deserialize'

我读过这个article,但它似乎已经过时了。它指的是protobuf-net 的旧实现。我希望在此期间有所改变。

我的问题是:

    是否可以使用protobuf-net r602 定位来自Unity3DiOS 设备,而无需

    为您想要的模型类创建一个库 dll(程序集) 序列化/反序列化

    喜欢链接博客文章中的建议吗?我想要一个更快的工作流程,可能会直接在Unity3D 项目中导入使用protogen 生成的C# 文件

    如果是,怎么做?我需要参考哪个dll?使上述 sn-p 在iOS 设备上再次工作的步骤是什么?

【问题讨论】:

设备出现什么错误?另外:为了性能,首选的方式生成一个dto程序集,然后使用“预编译”:iOS上缺乏元编程是原因。 @MarcGravell:很遗憾,我现在没有设备。错误是关于 JIT 的。如果我没有出错的话是这样的: ExecutionEngineException: Attempting to JIT compile method。所以正确的方法是关注链接的博客文章?但它指的是您的软件的过时版本:code.google.com/p/protobuf-net/downloads/…。 【参考方案1】:

我相信这是解决方案:

在 iOS 上,Apple 存在一个问题,即不允许在运行时进行 JIT 编译,这会阻止使用 protobuf。可以用 Environment.SetEnvironmentVariable("MONO_REFLECTION_SERIALIZER", "yes");在使用任何 protobuf 之前,但它仅适用于 .NET 4.6。 (我试了3.5,JIT的错误还是出现)

https://github.com/5argon/protobuf-unity

【讨论】:

以上是关于针对 iOS 的 Unity3D 中的协议缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

使用协议缓冲区将二进制文件从 Java 服务器发送到 C# Unity3d 客户端

IO与NIO

带标准IO带缓存区和非标准IO 遇到fork是的情况分析

IO流的总结

C语言之清空缓存区

如何清除Oracle中的所有缓存项