在视频与图像格式 (YUV色彩空间) 中,这是最常遇到这两个词的场景,它们描述的是数据在内存中的存储方式。
| 特性 | Planar (平面格式) | Semi-Planar (半平面格式) |
|---|---|---|
| 存储结构 | 三个独立平面:所有Y分量连续存储在一个区域,所有U分量在另一个区域,所有V分量在第三个区域。 | 两个平面:一个平面存放所有Y分量,另一个平面将U和V分量交错存放(例如 U, V, U, V...的顺序)。 |
| 通俗理解 | 像三本各自独立的书,分别存放Y、U、V数据。 | 像两本书,一本放Y,另一本将U和V按页交错装订在一起。 |
| 内存布局 | YYYY... UUUU... VVVV... | YYYY... UVUVUV... |
| 常见格式举例 I420, YUV420P, YUV422P | NV12, NV21, YUV420SP |
简单来说,Planar格式分离得更彻底,而Semi-Planar格式则是为了在保持一定分离的同时,提高数据访问的局部性(因为U和V通常成对使用)。意义体现在以下三个维度:
对硬件(芯片/摄像头)的意义:简化设计,降低延迟
- Planar(全分离):Y、U、V三个平面在物理内存中是三个独立的连续区域。硬件(如摄像头ISP图像信号处理器)可以用三个独立的DMA通道同时读取这三个区域,互不干扰。这非常适合并行流水线设计,但缺点是硬件引脚和总线控制逻辑更复杂。
- Semi-Planar(UV交错):只有Y和UV两个平面。硬件通常只需要两个DMA通道(一个读Y,一个读UV)。这不仅节省了芯片内部的布线资源,更重要的是,U和V在同一个平面内物理相邻,硬件一次突发读取就能同时拿到一对UV数据,减少了寻址次数。因此,绝大多数手机和安防摄像头传感器原生输出的就是Semi-Planar(如NV12),以降低功耗。
对软件/算法(CPU/GPU)的意义:缓存命中率与访存效率
-
Planar:在进行只处理Y亮度的算法(如灰度转换、边缘检测)时,数据是完全连续的,CPU的预取机制命中率极高,速度飞快。但如果要处理色度(UV),由于U和V隔得很远,CPU需要频繁跳转内存地址,容易导致缓存未命中(Cache Miss)。
-
Semi-Planar:在处理色度相关的滤波、缩放或颜色矫正时,由于U和V被打包放在一起,CPU加载一个缓存行(Cache Line,通常64字节),里面既有U又有V。这对SIMD(单指令多数据流)指令集(如NEON或AVX)极其友好,可以用一条指令同时加载并计算U和V,计算效率比Planar格式高出将近一倍。
实际工程中的"坑":零拷贝与格式转换开销
这是最现实的意义------谁更容易避免无效拷贝。
- Planar(如I420):因为三块数据分离,很多图形API(如老旧的OpenGL)需要绑定三个独立的纹理才能渲染,处理起来很麻烦。因此,当从摄像头拿到Planar数据时,软件往往要先将其转换成Semi-Planar或打包格式(Packed)才能送去显示,这个过程会消耗额外的CPU周期和功耗。
- Semi-Planar(如NV12):它是绝大多数视频编码器(H.264/H.265硬件编解码单元)和显示控制器原生接受的标准格式。如果你的数据是Semi-Planar,从摄像头采集 -> 编码 -> 显示,全程不需要做任何内存格式转换(即"零拷贝"),延迟最低、功耗最低。
一个极致的细节:内存占用的差异(微乎其微)
从数学上看,对于YUV420:
- Planar占3个分配头(malloc次数多,内存碎片风险高)。
- Semi-Planar占2个分配头(更紧凑)。
虽然总数据量完全一样(Y占WH,UV共占WH/2),但Semi-Planar仅需两块连续内存,在大分辨率(如4K/8K)场景下,分配大块连续内存的成功率更高,且减少内存碎片。
Planar的优势在于Y数据访问极快,适合做图像分析(如人脸检测,只读Y);Semi-Planar的优势在于硬件兼容性好、UV计算效率高,适合做编解码和渲染。这就是为什么Semi-Planar(NV12)是现代视频领域的事实标准,而Planar(I420)则更多地用于学术研究和跨平台软件解码(如FFmpeg软解)。