Поддержка сжатия Zip в Unity

Мы строим игру на основе Unity и столкнулись с проблемой DeflateStream в Windows. (Мы пытаемся сжать пакеты, отправляемые через websocket)

Похоже, что Unity не поддерживает zip на некоторых платформах:

System.DllNotFoundException: MonoPosixHelper
  at (wrapper managed-to-native) System.IO.Compression.DeflateStream:CreateZStream (System.IO.Compression.CompressionMode,bool,System.IO.Compression.DeflateStream/UnmanagedReadOrWrite,intptr)
  at System.IO.Compression.DeflateStream..ctor (System.IO.Stream compressedStream, CompressionMode mode, Boolean leaveOpen, Boolean gzip) [0x00000] in <filename unknown>:0 
  at System.IO.Compression.DeflateStream..ctor (System.IO.Stream compressedStream, CompressionMode mode, Boolean leaveOpen) [0x00000] in <filename unknown>:0 
  at (wrapper remoting-invoke-with-check) System.IO.Compression.DeflateStream:.ctor (System.IO.Stream,System.IO.Compression.CompressionMode,bool)
  at WebSocketSharp.Ext.compress (System.IO.Stream stream) [0x00000] in <filename unknown>:0 
  at WebSocketSharp.Ext.Compress (System.IO.Stream stream, CompressionMethod method) [0x00000] in <filename unknown>:0 
  at WebSocketSharp.WebSocket.send (Opcode opcode, System.IO.Stream stream) [0x00000] in <filename unknown>:0 
UnityEngine.Debug:Log(Object)
ServerConnection:<connectToServer>m__7(Object, ErrorEventArgs) (at Assets/Scripts/Network/ServerConnection.cs:83)
WebSocketSharp.Ext:Emit(EventHandler`1, Object, ErrorEventArgs)
WebSocketSharp.WebSocket:error(String, Exception)
WebSocketSharp.WebSocket:send(Opcode, Stream)
WebSocketSharp.WebSocket:Send(String)
ServerConnection:sendRegInfo() (at Assets/Scripts/Network/ServerConnection.cs:108)
ServerConnection:onOpen() (at Assets/Scripts/Network/ServerConnection.cs:58)
ServerConnection:<connectToServer>m__4(Object, EventArgs) (at Assets/Scripts/Network/ServerConnection.cs:77)
WebSocketSharp.Ext:Emit(EventHandler, Object, EventArgs)
WebSocketSharp.WebSocket:open()

Мы также нашли некоторую информацию об этой ошибке:

Mono implements System.IO.Compression.GZipStream not with a managed implementation, but it relies on a system installed zlib instead

Вопрос - есть ли простые варианты? Может быть, мы можем предоставить zlib в нашем проекте или что-то еще простое? Мы знаем о SharpZipLib, но у него немного странный API.

1 ответ

Я не могу сказать о последней версии Unity, но у меня есть опыт сжатия в предыдущей (3.x, 4.x), и я думаю, что ситуация не сильно изменилась.

Unity построен на самой старой старой версии mono (v2.6) с некоторыми хаки из команды Unity и никогда не обновлялся до последних версий mono в течение всей жизни Unity. Это означает, что Unity наследует все старые моно-ошибки, которые были исправлены в последних версиях моно. Одной из этих ошибок была ошибка с потоком дефляции Mono & DeflateStream. Он был исправлен довольно быстро в моно, но не был исправлен в Unity.

Чтобы обойти эту ошибку для моего веб-приложения Unity, я должен использовать управляемую реализацию потока Deflate. Я решил использовать Ionic.Zlib, он имеет тот же интерфейс, что и System.IO.Compression.

Плохо то, что его производительность примерно в 3 раза хуже, чем у собственной монофонической реализации, но добавление ifdefs в исходный код решает проблему производительности, по крайней мере, для серверного кода.

#if UNITY
using Ionic.Zlib;
#else
using System.IO.Compression;
#endif
Другие вопросы по тегам