2017-08-05 52 views
0

在我的遊戲中,我使用相關類的屬性[Serializable]將我的廣告系列(地圖和關卡集合)串入到一個文件中,但現在廣告系列的尺寸接近20MB,並且對於序列化/解串行而言,速度變得太慢。你可以反序列化一個使用[Serializable]屬性到現在實現ISerializable的類的文件嗎?

目前大約需要11秒才能將活動從磁盤反序列化到內存中。

我知道protobuf-net,但我現在想嘗試ISerializable的方法。在一個類上實現ISerializable接口是否會干擾該類的以前版本的反序列化,該版本只使用[Serializable][NonSerialized]屬性進行序列化?

我想我可以創建一個ISerializable每個相關類的副本並將數據從一個副本複製到另一個,但這聽起來像是一場災難。

是否可以告訴BinaryFormatter忽略任何ISerializable屬性並僅使用[Serializable][NonSerialized]屬性進行反序列化?

更新1:我使用自定義活頁夾來修復類型和程序集名稱的差異,但這不會在不使用時造成顯着差異。

更新2: SSD嵌入式內容deserialisation大約需要12.2S, SSD磁盤文件deserialisation大約需要11.4s, MemoryStream系列化大約需要3.4s和 MemoryStream deserialisation大約需要11.2s。 我感到很傻,但我忘了提及這一切都是在一個單獨的線程上完成的。我會增加它的優先級,看看是否會改變任何東西。

更新3:加載線程優先級設置爲Highest修剪不到一秒鐘。

謝謝你的時間。

+0

那些20 MB未壓縮或壓縮的數據?只是想知道磁盤I/O是否可能是延遲的主要原因,以及是否有壓縮數據可能實際上有幫助。 –

+0

現在,20MB的文件很可能會在不到1秒的時間內被讀取,緩存並完全放入內存中,即使是從硬盤驅動器中。我懷疑所花費的時間更多的是與反序列化本身有關。 – bazza

+0

我同意其他答覆。時間可能是文件的讀/寫時間,而不是序列化的時間。我會運行一個實驗並將文件讀入內存流。然後從內存流中序列化。您可以添加時間來查看代碼,以瞭解需要多少時間讀入內存流以及序列化的時間。 – jdweng

回答

1

我最終用ISerializable裝飾了幾個類,併爲它們實現GetObjectData()方法和ISerializable構造函數。我使用成員變量名作爲AddValue(string name, object value)的關鍵字,並且這完全反序列化了我的對象。

但是,不僅文件大小增加了,而且後續的反序列化時間增加了大約30-40%。

我會建議人們使用protobuf-net因爲它看起來像以最快的方式連載/ deserialise數據到一個小文件,但XmlSerializer也被證明能增加速度,大致在BinaryFormatter

BIG減小文件大小更新:完全實施protobuf-net所有與主要活動內容相關的課程,哦,男孩是我沒有失望。

總檔案大小爲~60個級別,所有的世界地圖只有21MB,現在使用protobuf-net其5.1MB!

不僅如此,加載時間超過12秒只是將主要活動加載到內存中。現在遊戲加載設置,用戶配置文件,所有紋理和主要活動在幾十毫秒比一秒慢!我很抱歉,但我不配得到如此驚人的改善。

我的遊戲現在業務已遍及感謝Marc Gravell的出色API

感謝大家的意見幾乎爲零加載時間。

0

您可以使用Colfer生成可序列化的bean。無需更改代碼;儘管使用本土元帥和解組方法將是最佳選擇。甚至比ProtoBuf更快更小。 ;-)

相關問題