首页 > Unity3D频道 > 【Unity杂文】 > Unity3D研究院之LZMA压缩文件与解压文件
2014
08-12

Unity3D研究院之LZMA压缩文件与解压文件

前两天有朋友告诉我Unity的Assetbundle是LZMA压缩的,刚好今天有时间那么就研究研究LZMA。它是一个开源的类库,有C、 C++、C#、JAVA的类库,那么在我大Unity里面我们当然要使用C#的类库啦。

下载地址:http://www.7-zip.org/sdk.html  或者在文章的最后下载我的测试工程、如下图所示,因为9.22是Beta版本,所以我们还是老老实实下载9.20正式版本。

Unity3D研究院之LZMA压缩文件与解压文件 - 雨松MOMO程序研究院 - 1

 

解压后把整个CS文件夹拖入Unity工程即可。当我在拖入Unity的时候发现Settings.cs报错了,查了一下是因为mono并不是完整的.net 。不过这个文件我们不需要用,所以直接把Settings.cs删除即可。

Unity3D研究院之LZMA压缩文件与解压文件 - 雨松MOMO程序研究院 - 2

 

下面上代码,这是编辑时的一个类。我先把根目录下的一个文件压缩,接着在解压缩。

我参考了这篇文章,不过它点问题,所以我改了改。

 http://stackoverflow.com/questions/7646328/how-to-use-the-7z-sdk-to-compress-and-decompress-a-file

如下图所示,我把1.jpg先压缩成2.zip ,然后在把2.zip在解压成3.jpg。

Unity3D研究院之LZMA压缩文件与解压文件 - 雨松MOMO程序研究院 - 3

 

下载地址:http://pan.baidu.com/s/1dDBxyBv

如果你想运行时运行LZMA按照上述代码简单改改就可以使用了。比如你把压缩过的文件放在服务器,然后用www下载到内存以后,可以通过lzma的解压方法将文件还原在保存在本地。 欢迎大家一起讨论与学习。嘿嘿,或者有什么更好的压缩方式,欢迎在下面给我留言,谢谢。

 

雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!

--

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。

Unity3D研究院之LZMA压缩文件与解压文件》有 73 条评论

  1. 滕凌锋 说:

    雨神,不管是7ZIP还是GZIP都支持移动端吗?

  2. Momo 说:

    assetbundle 相关的 一篇继续一篇,好过瘾,一找就是你的 ,哈哈

  3. river 说:

    demo压缩一张图片是没问题的,如果压缩一个文件夹,再把文件夹解压用上边代码测试报Data Error。求解?

  4. SHY 说:

    各位大神问个问题。问什么压缩后的大小和压缩前的大小差不多呢?几乎没什么变化。。。

  5. 雨神参照你的代码我写了Unity LZMA GZIP 压缩、解压文件 和 打包文件夹 (支持进度回调) ,http://blog.csdn.net/y1196645376/article/details/52492294打个广告,谢谢了

  6. 于培亮v 说:

    雨神如你所述是压缩一张图片,如果压缩一个文件夹,再把文件夹解压用上边代码测试报Data Error。不知你有没有测试过?

  7. dss38 说:

    可以来个GZIP的例子工程吗?雨神。

  8. wasd 说:

    雨神,能发下GZIP的压缩方式和解压方式吗?看你们的讨论最后说是GZIP压缩最好但是都没说怎么压缩。

  9. 王陶 说:

    雨松,我用SharpZipLib在IOS解压文件夹后,子文件夹里面的文件直接跳到解压文件中了,你遇到过这种情况吗?

  10. 阿尼薇__ 说:

    哈喽,momo大大,问个问题吗,我尝试用StreamWriter写入一个用WWW来读取的二进制文件,但是发现那个生成的文件没有被压缩,再次用WWW来读取我自己生成的文件的时候会报Failed to decompress data for the AssetBundle。。。请问这个要咋个整呢?

  11. 张海鹏 说:

    可以来个GZIP的例子工程吗

  12. 悈詪 说:

    想请教一下,压缩一个文件夹怎么实现。单个文件的压缩与解压我是尝试成功,可是压缩目录确实没有头绪,若方便,还请不惜赐教,给些启示。先谢过啦~

  13. 衣匠 说:

    看了源代码,已经知道如何显示进度了。正研究如何压缩一个文件夹中的所有文件到一个压缩包中,列子好像没有写,源码也没有好像,不知道有木有人晓得哦。这个才是最终的目的。

  14. 衣匠 说:

    这个确实有用,能不能获得压缩的进度和解压的进度,压缩比较的文件肯定要等的……如何写呢?

  15. jackalan 说:

    你解压这种写法有很大问题,FileStream input在读完第一次以后流没有释放掉,第二次读就会报错

    • 雨松MOMO 说:

      哦。 我忘清空了。 不过我后来没用这个, LAMZ解压时间太长了 现在在用GZIP

      • 衣匠 说:

        GZIP 有 C#版吗? 能给Unity 用么?另外还发现,LZMA 这个东西PC没问题,移动平台就有问题了。

      • 雨天 说:

        GZIP在MAC平台下默认有一个LIB存在,能够直接使用API进行压缩和解压缩的工作,而且速度非常快,压缩包大小稍微大一点点,但是在WINDOWS平台就用不了了,缺少LIB包。。。我换了另外的ICSharpCode.SharpZipLib 解压速度不能忍啊。。。。请问一下有没有更好的解决方案。

      • 宁唯是宁唯 说:

        雨松你好,打扰你了。请问你用的GZIP库可以分享一下不,或者告诉来源。谢谢。

  16. kan 说:

    我先打包一个预制,然后用你的方法压缩,解压,再加载解压出来的.unity3d文件,但加载不了,错误:ArgumentException: The thing you want to instantiate is null.

  17. leo_k 说:

    大神,我参考您写的文章,用LMZA压缩了一个打包好的未压缩的场景(参考您的Assetbundle文章),然后用CreateFromFile读取的时候,他还是按压缩的场景读取,结果报错说不能用压缩的场景,不知为何。。。。而且我用winRAR软件试图打开LMZA压缩的文件,结果说这个文件格式未知或数据已损坏(保存的格式为.zip)。。。。求指点

  18. wangeryin 说:

    问下 怎么判断这个文件已经解压过了? 解压已经解压过的文件, 就会产生OutOfMemory异常导致闪退.

  19. Tester 说:

    你好怎么实现异步解压

  20. Gavin 说:

    你好我用了你的方法压缩txt文件,unity 4.6.3 在64位windows和mac下都能正常解压,唯独用touch同步调试的时候,显示access to the path “解压文件路径” is denied网上搜到的都是纯windows下的解决方法,mac下也已经给了所有用户读和写权限,还是没能解决

  21. paranoia 说:

    只能一个个文件压缩吗,能不能把一个文件夹一次性整体压缩?

  22. mengxiang1023 说:

    请问如何在压缩的时候添加密码?

  23. Billy_Zhuang 说:

    在移动平台上我先使用LZF再使用LZMA压缩,对于文本和二进制文件压缩率和压缩/解压时间都有较大的改善。

  24. 说:

    请问下这个与楼主先前的7ZIP比效率如何

  25. 小三国 说:

    还有就是不明白为什么不在打包的时候让unity自己就压缩好呢?不是默认的打包是可以压缩的吗?

  26. 小三国 说:

    MOMO大大,我发现如果有多个需要打包的assetbundle,分别打包的后的总大小比打在一起的总大小要大,而且需要打包的数量越多就越明显,一个项目里要打包的资源是不可能很少的,那么是不是全部打在一起呢?

  27. cc猫 说:

    Unity3D研究院之LZMA压缩文件与解压文件 - 雨松MOMO程序研究院 - 1 想问下雨大大,这个做批量的压缩资源包怎么做呢?

  28. 黄孝敏 说:

    我在安卓上用LZMA解压.zip文件并写入本地总是失败,怎么回事呢?在PC上是可以解压的,我的代码如下private static void DecompressFileLZMA(Stream input, string outFile) { SevenZip.Compression.LZMA.Decoder coder = new SevenZip.Compression.LZMA.Decoder(); FileStream output = new FileStream(outFile, FileMode.Create); // Read the decoder properties byte[] properties = new byte Unity3D研究院之LZMA压缩文件与解压文件 - 雨松MOMO程序研究院 - 1 ; input.Read(properties, 0, 5); // Read in the decompress file size. byte[] fileLengthBytes = new byte Unity3D研究院之LZMA压缩文件与解压文件 - 雨松MOMO程序研究院 - 2 ; input.Read(fileLengthBytes, 0, 8); long fileLength = BitConverter.ToInt64(fileLengthBytes, 0); // Decompress the file. coder.SetDecoderProperties(properties); coder.Code(input, output, input.Length, fileLength, null); output.Flush(); output.Close(); input.Close(); }outFile = string.Format(“{0}/{1}.assetbundle”, Application.persistentDataPath, myAssetBundle.FileName)运行时路径是:”/storage/sdcard0/Android/data/xxxxx/files/xxxxx.assetbundle”求大神解惑

  29. LEF 说:

    我在服务器端压缩了www.text,在客户端如何解压啊?

  30. Yang 说:

    多个压到一个,怎么压,怎么解压。。。这是个问题 Unity3D研究院之LZMA压缩文件与解压文件 - 雨松MOMO程序研究院 - 1

  31. 大叔 说:

    DecompressFileLZMA(string inFile, string outFile) 中的 参数 inFile 怎么和www下载下来的文件 联系起来呢?

  32. 大叔 说:

    用了这个就用不着ab了吧? 我要更新的都是图片.压缩好放服务器.然后下载了直接解压就是替换老的图片了吧?

  33. 浮山s瓢瓢 说:

    哈哈,最近在做更新,发现打出的ab非常大,用了这个压缩,缩小了10倍左右,开心开心,哈哈 Unity3D研究院之LZMA压缩文件与解压文件 - 雨松MOMO程序研究院 - 1

    • 雨松MOMO 说:

      lzma压缩是小了 但是解压的时间就长了。。 呵呵

      • 浮山s瓢瓢 说:

        我是在看了您的Unity3D研究院之Assetbundle的实战(六十三)这篇博文的下面补充,才想到的对资源进行压缩,用了一些别的压缩方法竟然都没成功。就学习了您的,我们最近也想做资源更新,我发现我即使用依赖打包的那种方式,会把资源包搞得很大,,这样在手机Application.persistentDataPath目录下面显得数据非常大(我试的安卓机),玩家一清除数据就啥也没了,就想到了写到手机的固定存储位置,这样就是从固定位置读取了,下载包小一点可以节省玩家流量。哈哈,就压缩,就想着程序在把资源更新下来后顺便解压还原,在游戏中运行了后采用选择性加载。说了这么多,您这么一说,解压时间长,哎,就说明我的思路又有问题了,坑啊 Unity3D研究院之LZMA压缩文件与解压文件 - 雨松MOMO程序研究院 - 1

      • 大叔 说:

        13m 用了90秒 ipod 5

    • SHY 说:

      麻烦问下。如何缩小10倍。我测试过发现,压缩前和压缩后基本没什么变化呢。。

  34. 和谐大大 说:

    考虑这个能不能做增量。然后我把多个文件压到一起,请问大大解压的时候怎么获取里面文件的名字??

  35. 小展 说:

    压缩效果好像不是那么明显哈

留下一个回复

你的email不会被公开。