-
Notifications
You must be signed in to change notification settings - Fork 0
AFBC
在传输优化里, 我讲了几种优化数据传输的方式; 当我们都使用上这些拓展时, 效率就足够搞了吗?
理论上是差不多了,但在 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 Encoder
和 AFBC Decoder
, 在进入总线时压缩数据, 在离开总线时解压数据.
故在硬件的加持下, 确实 AFBC
的传输效率会高不少, 已经带宽占用也会少很多.
我自己测试过, 使用
AFBC
在test_compositor
这种示例下, 带宽由4000MB/s
左右下降至800MB/s
左右, 规格应该为4K@30
.