核心技术-压缩与加密
篇章 :07-核心技术-资源打包系统 阅读时间 :约 25 分钟 前置知识:了解打包策略
一、引言
本章将深入解析 YooAsset 资源打包中的压缩与加密技术。压缩可以减小包体大小、加快网络传输;加密可以保护游戏资源不被非法获取和修改。深入理解压缩与加密的原理和最佳实践,有助于开发者做出合理的权衡。
YooAsset 支持 LZ4、LZMA 两种压缩方式和 AES、XOR 两种加密方式。本章将详细解析这些技术的原理、优缺点和适用场景。
二、LZ4 压缩
2.1 LZ4 概述
LZ4 是一种快速压缩算法:
特点:
- 压缩率适中(50-70%)
- 压缩速度快
- 解压速度极快
- 适合运行时加载
YooAsset 中的应用:
LZ4 是 YooAsset 默认推荐的压缩方式。
2.2 LZ4 实现
csharp
public class LZ4Helper
{
public static byte[] Compress(byte[] data)
{
using (var output = new MemoryStream())
{
using (var compressor = new LZ4Stream(output, LZ4StreamMode.Compress))
{
compressor.Write(data, 0, data.Length);
}
return output.ToArray();
}
}
public static byte[] Decompress(byte[] compressedData)
{
using (var input = new MemoryStream(compressedData))
using (var decompressor = new LZ4Stream(input, LZ4StreamMode.Decompress))
using (var output = new MemoryStream())
{
decompressor.CopyTo(output);
return output.ToArray();
}
}
}
LZ4Stream 详解:
使用 K4os.Compression.LZ4 库实现 LZ4 压缩和解压。
压缩流程详解:
- 创建输出流
- 创建 LZ4 压缩流
- 写入数据
- 关闭压缩流
- 获取压缩后的数据
解压流程详解:
- 创建输入流
- 创建 LZ4 解压流
- 复制到输出流
- 获取解压后的数据
2.3 LZ4 性能
| 指标 | LZ4 表现 |
|---|---|
| 压缩率 | 50-70% |
| 压缩速度 | ~500 MB/s |
| 解压速度 | ~2 GB/s |
| 内存占用 | 低 |
压缩率详解:
LZ4 的压缩率一般为 50-70%,即压缩后大小为原始大小的 30-50%。
解压速度详解:
LZ4 的解压速度可达 2 GB/s,远高于 LZMA。
2.4 LZ4 适用场景
推荐使用 LZ4:
- 运行时频繁加载的 Bundle
- 移动端资源
- 大型资源
- 启动必需资源
配置方式:
csharp
buildParameters.CompressOption = ECompressOption.LZ4;
三、LZMA 压缩
3.1 LZMA 概述
LZMA 是一种高压缩率算法:
特点:
- 压缩率高(30-50%)
- 压缩速度慢
- 解压速度较慢
- 适合网络传输
YooAsset 中的应用:
LZMA 适合用于网络传输的资源,可以减少下载量。
3.2 LZMA 实现
csharp
public class LZMAHelper
{
public static byte[] Compress(byte[] data)
{
using (var output = new MemoryStream())
{
using (var compressor = new LZMAStream(output, LZMAStreamMode.Compress))
{
compressor.Write(data, 0, data.Length);
}
return output.ToArray();
}
}
public static byte[] Decompress(byte[] compressedData)
{
using (var input = new MemoryStream(compressedData))
using (var decompressor = new LZMAStream(input, LZMAStreamMode.Decompress))
using (var output = new MemoryStream())
{
decompressor.CopyTo(output);
return output.ToArray();
}
}
}
LZMAStream 详解:
使用 SevenZip.Compression.LZMA 库实现 LZMA 压缩和解压。
3.3 LZMA 性能
| 指标 | LZMA 表现 |
|---|---|
| 压缩率 | 30-50% |
| 压缩速度 | ~5 MB/s |
| 解压速度 | ~100 MB/s |
| 内存占用 | 高 |
压缩率详解:
LZMA 的压缩率比 LZ4 高,但解压速度慢。
适用场景详解:
LZMA 适合一次性下载的资源,如初始包、DLC 等。
3.4 LZMA 的权衡
压缩率 vs 解压速度:
LZMA 压缩率比 LZ4 高 20-30%,但解压速度慢 10-20 倍。
适用场景:
- 安装包内资源
- 一次性下载的大资源
- 网络传输场景
不适用场景:
- 运行时频繁加载
- 移动端
- 实时加载
四、不压缩
4.1 不压缩的适用场景
某些场景下不压缩更合适:
已压缩资源:
- PNG 格式图片
- MP3/AAC 音频
- 视频文件
- ZIP 等已压缩格式
小文件:
- 配置文件(JSON、XML)
- 小图片
- 文本文件
临时资源:
- 调试日志
- 临时缓存
4.2 不压缩的实现
csharp
buildParameters.CompressOption = ECompressOption.Uncompressed;
不压缩的优势:
- 加载速度最快
- 无压缩/解压开销
- 适合已压缩资源
不压缩的劣势:
- 包体大
- 占用更多磁盘空间
4.3 混合压缩策略
csharp
// 大 Bundle 使用 LZMA
var largeBundleParams = new BuildParameters
{
CompressOption = ECompressOption.LZMA,
};
// 小 Bundle 使用 LZ4
var smallBundleParams = new BuildParameters
{
CompressOption = ECompressOption.LZ4,
};
混合策略详解:
根据 Bundle 的大小和用途选择不同的压缩方式。
五、AES 加密 / XOR 加密
5.1 AES 加密
AES 是 YooAsset 推荐的加密方式:
特点:
- 安全性高
- 性能较好
- 标准化程度高
- 行业广泛使用
性能:
| 指标 | AES 表现 |
|---|---|
| 加密速度 | ~200 MB/s |
| 解密速度 | ~250 MB/s |
| 安全性 | 高 |
| 密钥长度 | 128/192/256 位 |
AES 适用场景:
- 重要游戏资源
- 付费内容
- 防止资源被非法获取
5.2 XOR 加密
XOR 是一种简单的加密方式:
特点:
- 简单、快速
- 安全性低
- 适合临时加密
- 适合小文件加密
XOR 性能:
| 指标 | XOR 表现 |
|---|---|
| 加密速度 | ~1 GB/s |
| 解密速度 | ~1 GB/s |
| 安全性 | 低 |
| 密钥长度 | 自定义 |
XOR 适用场景:
- 临时保护
- 简单加密
- 性能要求高
5.3 加密方案选择
安全需求高:
使用 AES 加密。
性能需求高:
使用 XOR 加密。
混合使用:
csharp
// 核心资源使用 AES
var criticalCollector = new AssetBundleCollector
{
CollectPath = "Assets/Critical",
EncryptionType = EEncryptionType.AES,
};
// 一般资源使用 XOR
var normalCollector = new AssetBundleCollector
{
CollectPath = "Assets/Normal",
EncryptionType = EEncryptionType.XOR,
};
六、压缩与加密的组合
6.1 组合方式
先压缩后加密:
csharp
// 1. 压缩
byte[] compressed = LZ4Helper.Compress(originalData);
// 2. 加密
byte[] encrypted = AESHelper.Encrypt(compressed, key);
优势:
- 加密后的数据更小
- 网络传输量小
- 减少下载时间
劣势:
- 需要先解密后解压
- 双重处理开销
6.2 推荐组合
iOS 平台:
csharp
// LZ4 + AES 加密
buildParameters.CompressOption = ECompressOption.LZ4;
buildParameters.EnableEncryption = true;
理由:
- iOS 设备性能强,可以处理 AES
- LZ4 解压快,加载性能好
Android 平台:
csharp
// LZ4 + XOR 加密
buildParameters.CompressOption = ECompressOption.LZ4;
buildParameters.EncryptionType = EEncryptionType.XOR;
理由:
- Android 设备性能差异大
- XOR 性能开销小
WebGL 平台:
csharp
// LZ4 + 不加密(性能考虑)
buildParameters.CompressOption = ECompressOption.LZ4;
buildParameters.EnableEncryption = false;
理由:
- WebGL 性能有限
- 资源已经通过网络传输
PC 端:
csharp
// LZ4 + AES 加密
buildParameters.CompressOption = ECompressOption.LZ4;
buildParameters.EnableEncryption = true;
6.3 性能影响
压缩对性能的影响:
- 增加打包时间
- 增加解压开销(运行时)
- 减小包体和网络传输
加密对性能的影响:
- 增加打包时间
- 增加解密开销(运行时)
- 提高安全性
综合性能:
- LZ4 解压 ~2GB/s,几乎无感知
- AES 解密 ~250MB/s,对加载有轻微影响
- 综合开销在可接受范围内
七、总结
本章深入解析了 YooAsset 资源打包中的压缩与加密技术,包括:
- LZ4 压缩:LZ4 概述、实现、性能、适用场景
- LZMA 压缩:LZMA 概述、实现、性能、权衡
- 不压缩:不压缩的适用场景、实现、混合策略
- AES 加密:AES 加密、性能、适用场景
- XOR 加密:XOR 加密、性能、适用场景
- 压缩与加密的组合:组合方式、推荐组合、性能影响
通过合理选择压缩和加密方式,可以在包体、安全性、性能之间取得最佳平衡。
下一篇 :核心技术-资源组织与依赖