写在前面
我们在打包的时候unity会自动的把我们在场景中用到的资源与一些特殊文件夹中的资源压缩,但是如果我们需要做热更或者还想减少包的大小,虽然AssetBundles是可以为我们压缩的,但是可以把ab包分的更加的细,方便管理。
用的啥
使用的SharpZipLib这个库,这个是官网。可以根据.net的版本来选在下载dll库,unity一般都是.net2.0。也是一个开源的项目,在GitHub上可以看到源码与一些例子代码。推荐可以下载下载看一看。这个库中不仅只有Zip这一种压缩方式还包括了很多其他的压缩方式。
怎么用
写了 一个简单的unity的demo,其实就是官方的例子抄了一遍,代码如下:
压缩
public static void TestZipFile (string[] fileNames, string outputFilePath, int compressLevel) {
try {
using (ZipOutputStream stream = new ZipOutputStream (File.Create (outputFilePath))) {
stream.SetLevel (compressLevel); //设置压缩等级0-9
byte[] buffer = new byte[4096];
foreach (string file in fileNames) {
var entry = new ZipEntry (Path.GetFileName (file));
entry.DateTime = DateTime.Now;
stream.PutNextEntry (entry);
using (FileStream fs = File.OpenRead (file)) {
int sourceBytes;
do {
sourceBytes = fs.Read (buffer, 0, buffer.Length);
stream.Write (buffer, 0, sourceBytes);
} while (sourceBytes > 0);
}
}
stream.Finish ();
stream.Close ();
Debug.Log ("压缩完成!");
}
} catch (Exception ex) {
Debug.Log ("异常为:" + ex);
}
}
解压
public static void TestUnZipFile (string zipPath, string outPath) {
if (!File.Exists (zipPath)) {
Debug.LogError ("没有此文件路径:" + zipPath);
return;
}
using (ZipInputStream stream = new ZipInputStream (File.OpenRead (zipPath))) {
ZipEntry theEntry;
while ((theEntry = stream.GetNextEntry ()) != null) {
// Debug.Log ("theEntry.Name:" + theEntry.Name);
string fileName = Path.GetFileName (theEntry.Name);
// Debug.Log ("fileName:" + fileName);
string filePath = Path.Combine (outPath, theEntry.Name);
// Debug.Log ("filePath:" + filePath);
string directoryName = Path.GetDirectoryName (filePath);
// Debug.Log ("directoryName:" + directoryName);
// 创建压缩文件中文件的位置
if (directoryName.Length > 0) {
Directory.CreateDirectory (directoryName);
}
if (fileName != String.Empty) {
using (FileStream streamWriter = File.Create (filePath)) {
int size = 2048;
byte[] data = new byte[2048];
while (true) {
size = stream.Read (data, 0, data.Length);
if (size > 0) {
streamWriter.Write (data, 0, size);
} else {
// Debug.Log (theEntry.Name+"解压完成!");
break;
}
}
}
}
}
Debug.Log ("解压完成!");
}
}
浅析原理
这几天看了一下源码,不知道是自己心不静还是真的有点难,虽然注释写的非常的详细,但是还是没有看明白其中的奥义。最终是使用的霍夫曼编码压缩算法来进行压缩的。具体的算法就不做介绍了,关于霍夫曼编码压缩算法的讲解。
不过不得不说这个源码的结构真心写的很不错,值得一读,都想再去读一次设计模式了。