1. 压缩概述:为什么需要压缩、压缩的收益与成本、压缩的分类

各位同学,咱们今天聊聊压缩。说实话,我在做接口优化之前,对压缩的理解也就停留在「把文件变小」这个层面。直到有一次线上事故,让我彻底改观了。

那是一个视频流接口,高峰期带宽被打满,用户端卡得不行。我查了半天,发现原始数据根本没做任何压缩,一个 4K 帧直接裸传。嗯,从那以后,压缩就成了我接口设计里的必选项。

1.1 为什么需要压缩

你想想看,显示接口传输的是什么?是像素、是帧、是海量的颜色数据。一个 1920×1080 的 RGBA 帧,不压缩的话有多大?

1920 × 1080 × 4 字节 = 8,294,400 字节 ≈ 7.9 MB

如果每秒 60 帧,那就是 474 MB/s 的带宽需求。这还只是一个通道。真实场景下,多路视频、高分辨率、高帧率并存,带宽压力可想而知。

我个人习惯把压缩的必要性归纳为三点:

  • 带宽瓶颈:物理链路总有上限,压缩是绕过瓶颈最直接的手段
  • 存储成本:原始数据存起来太贵,压缩能省下真金白银
  • 响应速度:数据量小了,传输时间自然缩短,用户体验提升

核心观点:压缩不是锦上添花,而是接口设计中必须考虑的基础能力。不做压缩的接口,就像没装刹车的车——能跑,但不敢跑快。

1.2 压缩的收益与成本

收益大家都懂,但成本往往被忽略。我在项目中遇到过几次「为了压缩而压缩」的案例,最后得不偿失。咱们用一张表说清楚:

维度 收益 成本
带宽 传输数据量减少 50%~90% 压缩/解压占用额外带宽(可忽略)
存储 磁盘/内存占用大幅降低 压缩算法需要额外存储空间(临时缓冲区)
延迟 网络传输时间缩短 压缩/解压增加计算延迟
CPU 减少 I/O 等待,CPU 利用率更均衡 压缩/解压消耗 CPU 周期
功耗 传输功耗降低 计算功耗增加(移动端尤其敏感)

避坑指南:我曾经在一个低功耗嵌入式项目里用了高压缩比的算法,结果解压功耗比传输功耗还高,电池续航直接砍半。后来换成了轻量级压缩,才平衡过来。压缩不是越狠越好,得看场景。

说白了,压缩的本质是用计算换空间。计算资源便宜、带宽贵的时候,压缩就划算;反过来,如果 CPU 是瓶颈,那就要慎重。

1.3 压缩的分类:有损 vs 无损

这是压缩领域最基础的分水岭。我习惯用一个问题来区分:解压后的数据,和原始数据一模一样吗?

  • 一模一样 → 无损压缩
  • 不一样但人眼/系统可接受 → 有损压缩

无损压缩

无损压缩的特点是:解压后数据完全恢复,不丢任何信息。常见的算法有:

  • Run-Length Encoding (RLE):适合连续重复数据,比如大面积纯色背景
  • LZ77 / LZ78:字典类压缩,PNG、ZIP 都在用
  • Huffman 编码:根据字符频率分配变长编码
  • 算术编码:比 Huffman 压缩率更高,但计算更复杂

在显示接口里,无损压缩常用于屏幕共享、远程桌面、医疗影像这些场景——丢一个像素都可能出问题。

有损压缩

有损压缩允许丢失一些人眼不敏感的信息,换来更高的压缩比。常见算法:

  • JPEG:基于 DCT 变换,丢弃高频细节
  • WebP:Google 出品,支持有损/无损双模式
  • AVIF:基于 AV1,压缩率比 JPEG 高 50%
  • 视频编码 (H.264/H.265/AV1):帧内+帧间预测,压缩比极高

有损压缩在视频流、图片传输、游戏串流里是主流。用户更在意流畅度,而不是每个像素的精确值。

我的经验:做接口设计时,我通常先问业务方「数据能不能丢?」。如果能接受有损,压缩比直接拉满;如果不能,就选无损里最快的算法。别上来就套用通用压缩库,先搞清楚约束条件。

1.4 压缩知识体系总览

下面这张图,是我自己梳理的压缩技术全景。你可以把它当作整个课程的地图:

接口资源压缩技术体系 压缩概述(本章) 有损压缩 无损压缩 JPEG / WebP H.264 / H.265 RLE / LZ77 Huffman / 算术 图片/视频传输 游戏串流 远程桌面 医疗影像 压缩比 | 压缩/解压速度 | 质量(PSNR/SSIM) 接口选型 & 性能调优(后续章节) 本课程将按此体系逐层深入,每章聚焦一个技术点

这张图把压缩技术分成了六个层次。咱们这章站在最顶层,先建立全局认知。后面每一章都会深入其中一个节点,从算法原理到工程实现,一步步拆解。

1.5 小结

这一章咱们聊了三件事:

  1. 为什么需要压缩——带宽、存储、速度,三个硬约束
  2. 压缩的收益与成本——用计算换空间,但要注意平衡点
  3. 有损 vs 无损——核心区别在于数据能否完全恢复

我个人觉得,理解压缩的关键不在于记住多少算法名字,而在于建立「成本意识」。每次做压缩选型时,多问自己一句:这个场景下,我到底在优化什么?带宽?延迟?还是功耗?

想清楚这个,后面的技术细节才有落脚点。