07-02-打包系统-压缩与加密策略

核心技术-压缩与加密

篇章 :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 压缩和解压。

压缩流程详解:

  1. 创建输出流
  2. 创建 LZ4 压缩流
  3. 写入数据
  4. 关闭压缩流
  5. 获取压缩后的数据

解压流程详解:

  1. 创建输入流
  2. 创建 LZ4 解压流
  3. 复制到输出流
  4. 获取解压后的数据

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 加密、性能、适用场景
  • 压缩与加密的组合:组合方式、推荐组合、性能影响

通过合理选择压缩和加密方式,可以在包体、安全性、性能之间取得最佳平衡。


下一篇 :核心技术-资源组织与依赖

相关推荐
Aman19843 小时前
Claude Code做Unity项目移植(一):从零散工具到团队式
unity·游戏开发·vibe coding·claude code·项目迁移
甲维斯9 小时前
白嫖Tripo3D ?Kimi 3D Make可以玩起来!
人工智能·unity3d
ZzT11 小时前
vibe coding 做小游戏·玩法篇:8 句试玩反馈,变成无限关卡、局外成长和援军登场
ai编程·游戏开发
ZzT1 天前
vibe coding 做小游戏·素材篇:Claude Code 操作网页版 ChatGPT,一个对话画完全套美术
ai编程·游戏开发
SmalBox1 天前
07-01-打包系统-资源分组策略
unity3d·游戏开发
ZzT2 天前
vibe coding 做小游戏·开工篇:5 天、8400 行代码一行没手写,先让 AI 能检查自己
ai编程·游戏开发·claude
Huanzhi_Lin2 天前
资源回收源码阅读参考-上
游戏开发·gc·laya·layaair·资源回收·laya3.4
SmalBox2 天前
06-04-源码-加密解密服务
unity3d·游戏开发
音视频牛哥2 天前
大牛直播SDK(SmartMediaKit)iOS平台Unity3D RTSP/RTMP播放器集成实践
音视频·unity3d·ios rtmp播放器·ios rtsp播放器·ios unity3d播放器·ios unity rtsp·ios unity rtmp