2015-04-14 3 views
0

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

Кажется, что Unity не поддерживает почтовый индекс на некоторых платформах:

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.

+0

Единство может иметь дополнительные соображения кроссплатформенные, но некоторые из ответов на этот вопрос [] (http://stackoverflow.com/questions/6341517/zip-lib-zlib-bzip2-and-mono- поддержка). – rutter

ответ

0

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

Unity построен на верхней старой версии mono (v2.6) с некоторыми хаками из команды Unity и никогда не обновлялся до последних версий моно в течение всего времени жизни 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