Skip to content
haorui wang edited this page Jul 21, 2024 · 2 revisions

背景

在传输优化里, 我讲了几种优化数据传输的方式; 当我们都使用上这些拓展时, 效率就足够搞了吗?

理论上是差不多了,但在 ARM 平台, 似乎还不够; 故有了今天的主角 AFBC.

AFBC 全称为 Arm FrameBuffer Compression, 是一种减少总线带宽的有效手段.

有关于 AFBC 的介绍有其他文章写得挺好的, 这里就不再赘述, 雷军说的AFBC+ASTC到底是什么?如何节能, 本文还是讲解一下技术背后的逻辑实现.

使用高效

AFBC 具有良好的空间局部性, 用人话来讲就是其比较容易被缓存命中;

这里就要扯到 SOC 的渲染方式, SOC 的渲染方式一般为瓦片渲染, 也就不是逐行渲染;

瓦片的渲染是将 Texture 或者其他资源切分为许多正方形小块, 然后从上到下, 从左到右依次处理.

不解释这种渲染方式的优缺点, 但要说的是 AFBC 的内存排布就是按照这种结构设计的.

AFBC 的内存布局按照 AFBC Header + AFBC Body 的结构组成, AFBC Body 可能就是 16x16 的内存小块, 符合瓦片渲染的采样特性, 故相比于其他格式, AFBC 具有更好的空间局部性.

AFBC Header 其实就是用来记录一些索引关系的头部.

传输高效

数据的传输是要经过总线的, 总线的传输带宽是有限的, 这里可以简单类比于网口进出即可;

AFBC 为什么传输会高效呢, 因为 ARM 内置了 AFBC EncoderAFBC Decoder, 在进入总线时压缩数据, 在离开总线时解压数据.

故在硬件的加持下, 确实 AFBC 的传输效率会高不少, 已经带宽占用也会少很多.

我自己测试过, 使用 AFBCtest_compositor 这种示例下, 带宽由 4000MB/s 左右下降至 800MB/s 左右, 规格应该为 4K@30.

Clone this wiki locally