【问题标题】:Deserialization slow performance in UnityUnity 中的反序列化会降低性能
【发布时间】:2015-12-30 11:05:38
【问题描述】:

我正在 Unity 中制作 3D 模拟器。
对于这个模拟器,我需要一些存储在 Serializable 对象中的数据。
这个对象是在我制作的 DLL 文件中定义的。
我用这段代码反序列化它:

public class myObject
{
    static public myObject LoadFromFile(String Path)
    {
        System.Runtime.Serialization.Formatters.Binary.BinaryFormatter BF = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
        System.IO.FileStream FS = new System.IO.FileStream(Path, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read);
        myObject Result = BF.Deserialize(FS) as myObject;
        FS.Close();
        return Result;
    }
}

我的统一程序引用了包含“myObject”定义的类库。
如果我从 Unity 运行反序列化功能,这个过程需要 35.080 秒。

如果我在一个 Windows 应用程序中运行它,该应用程序是我为测试目的而创建的,它引用同一个类库并打开同一个文件,这个过程只需要 0.260 秒。

即使我异步运行这个过程,在 Unity 中也需要很长时间。

我想知道为什么从 Unity 运行这段代码需要更长的时间? 对此我有什么可以做的吗?

提前致谢,
马丁

【问题讨论】:

  • 欢迎使用 StackOverflow,您在测试和 Unity 应用程序中使用相同的对象吗?
  • 是的,一切都一样

标签: c# serialization unity3d deserialization binaryformatter


【解决方案1】:

我不知道为什么会发生这种情况,但您可以尝试的一件事是实现 ISerializable 接口,自己序列化您的成员,看看 unity 是否仍然那么慢。

您将需要实现 GetObjectData 和采用 SerializationInfo 和 StreamingContext 的受保护构造函数。 GetObjectData 用于将对象放在序列化流上,构造函数用于....uhm....构造。

public class MyObject : ISerializable
{
  private bool somemember;

  protected Complaint(SerializationInfo info, StreamingContext context)
  {
    somemember = info.GetBoolean("b");
  }

  [SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)]
  public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
  {
    info.AddValue("b", somemember);
  }
}

希望这会有所帮助!

【讨论】:

  • 感谢您的帮助,我重写了代码并使用二进制写入器写入内存流并使用二进制读取器再次读取它,现在在 Unity 中只需 0.20 秒。再次感谢,马丁
【解决方案2】:

我不完全理解你的问题。您要访问的类在您的 .dll 文件中吗?如果是这样 - 您的类定义位于何处并不重要。您的数据存储在哪里以及如何存储?如果您想将数据永久存储在硬盘驱动器上,您可以轻松使用Json.NET 并将数据存储为 .json 文件。您尝试从哪种方法以及何时尝试在 unity 中加载数据?

此外,如果您打开一个文件流,您还应该在完成读取后再次关闭它。您还可以查看一些编码约定,例如here

【讨论】:

    猜你喜欢
    • 2016-02-25
    • 1970-01-01
    • 2023-04-10
    • 2015-07-01
    • 2018-12-12
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    • 2021-06-07
    相关资源
    最近更新 更多