简介和背景
Brotli-G 基于 IETF 维护的成熟的 Brotli 无损压缩算法标准(也称为 RFC7932)。Brotli 于 2013 年首次发布,开源规范在 2013 年至 2016 年间得到了开发和泛化。它由 Google Research 开发,作为 GZIP 和 Deflate 算法的开源继承者,性能相似(与 Deflate 相比),但压缩率更高。
最初的用例是通过压缩 Web 服务器和内容分发网络使用的数据来加快网站加载速度。Brotli 可用作许多类型数据/内容/资产的通用压缩方案。规范中定义的“目标受众”特征如下:
“本规范供软件实现者使用,以便将数据压缩成 Brotli 格式和/或从 Brotli 格式解压缩数据。”
Brotli 的现有生态系统
Brotli 算法的技术细节已得到充分记录(参见下文的资源部分)。从宏观上看,它是 LZ77 压缩算法和霍夫曼编码(类似于 GZIP 和 Deflate)的组合。
众所周知,Brotli 在所有指标上(压缩率、压缩速度和解压缩速度)与 GZIP 和 Deflate 等其他标准相比都具有竞争力。各种压缩标准的比较可见于 Squash Compression Benchmark (quixdb.github.io)。
由于其在性能和压缩率方面相对于早期压缩格式的明显优势,Brotli 已被广泛应用于 Web 应用程序和内容领域。Brotli 可用于压缩 Web 应用程序的资产,如字体、JavaScript、图像等。当资产文件大小变小时,可以通过网络更快地传输它们,并且当压缩/解压缩速度快时,网页加载速度更快,响应更灵敏。
- 如今,超过 95% 的网络浏览器支持 Brotli 解压缩(参见 https://caniuse.cn/?search=brotli)。
- 许多 Web 应用程序框架支持 Brotli 编码(例如 NGINX 和 ASP.NET)。
- 一些 CDN 使用 Brotli 编码(例如 Azure 和 ImageKit)。
Brotli 在这些领域已经取得了成功。当资产文件大小更小时,它们可以通过网络更快地传输,并且当压缩/解压缩速度快时,网页加载速度更快,响应更灵敏。
作为一个通用的数据压缩格式,Brotli 也可能应用于游戏和云游戏等其他软件生态系统。电子游戏是资产密集型的软件应用程序,许多游戏已经采用了某种类型的压缩来减小文件大小。通过提高压缩资产的压缩和解压缩性能,可以改善游戏体验。
Brotli-G:AMD 对 Brotli 的修改
AMD 对 Brotli 位流格式的修改侧重于在 GPU 和多线程 CPU 上实现高效、数据并行解压缩,同时仍能保持通用数据相当高的、最先进的压缩率。一些修改包括:
- 限制要压缩的块(页面)的大小,从而能够利用 GPU 的多个计算单元 (CU)。
- 实现了并行 Huffman 子流,从而能够使用 SIMD 处理。
- 简化了位流格式,以最大限度地提高 GPU 性能。
Brotli-G 解压缩算法已实现为“着色器”程序(使用 HLSL 编写),该程序几乎可以在任何支持 DirectX® 的图形卡上运行。在着色器中实现解压缩可以利用现代 GPU 硬件中巨大的并行处理能力,从而实现令人难以置信的快速解压缩速度。
现有的优化 Brotli 解压缩函数(CPU 实现)应该能够解压缩 Brotli-G 位流,而更优化的数据并行实现(在主机或加速器上)可以进一步提高性能。
开发者需要注意的一点是,已经使用 Brotli 压缩过的资产无法使用 Brotli-G 解压缩器进行解压缩。要利用 Brotli-G,必须使用兼容 Brotli-G 的压缩器(SDK 中也提供了)重新压缩资产。
AMD 发布的内容
我们正在发布一个 Brotli-G SDK,其中包含用于 CPU 压缩和解压缩(在 CPU 和 GPU 上)的源代码。该 SDK 还包含一个 CLI 应用程序的源代码,可用于测试和测量 Brotli-G 编解码器的性能。您可以在其 GitHub 存储库 中找到该 SDK。
我们还将把 Brotli-G 编解码器集成到我们的 Compressonator 内容创作工具链组件中,作为其 SDK 库中支持的压缩格式(即将推出)。
AMD 鼓励进行协作式开源开发,以进一步提高压缩率和 CPU/GPU 加速器上的多线程压缩/解压缩性能,并改进与通用 Brotli 格式的集成。
许可
Brotli-G 以与 Brotli 相同的许可条款发布(基于 MIT 的许可,称为 BCP 78),以支持在各种软件生态系统中广泛采用。
了解更多并下载
资源
- https://datatracker.ietf.org/doc/html/rfc7932
- https://en.wikipedia.org/wiki/Brotli
- https://github.com/google/brotli
- https://kinsta.com/blog/brotli-compression/
- https://imagekit.io/blog/what-and-why-brotli-compression/
- https://docs.nginx.com/nginx/admin-guide/dynamic-modules/brotli/
- https://devblogs.microsoft.com/dotnet/introducing-support-for-brotli-compression/
- https://learn.microsoft.com/en-us/azure/cdn/cdn-improve-performance#compression-rules
- https://css-tricks.cn/how-i-used-brotli-to-get-even-smaller-css-and-javascript-files-at-cdn-scale/
- https://github.com/GhostTyper/BrotliVsDeflate
- https://cran.r-project.cn/web/packages/brotli/vignettes/brotli-2015-09-22.pdf
- https://paulcalvano.com/2018-07-25-brotli-compression-how-much-will-it-reduce-your-content/
- https://quixdb.github.io/squash-benchmark/#results-table
- https://www.rfc-editor.org/info/bcp78
- https://caniuse.cn/?search=brotli