3、硬件加速方案:ISP管线中的对比度统计引擎、硬件窗口配置、DMA传输优化
做反差对焦,最怕什么?
怕CPU被统计计算占满,怕帧率掉得没法看,怕对焦像蜗牛爬。
说白了,纯软件算对比度,就是拿CPU的命去填。我早年在一个1080p项目上吃过这个亏——CPU占用率飙到80%,系统直接卡成幻灯片。从那以后,我对硬件加速这件事就特别上心。
这一章,我们就聊聊ISP管线里那些能帮我们“偷懒”的硬件模块。
3.1 对比度统计引擎:硬件替你算好了
现代ISP里,基本都集成了对比度统计引擎(Contrast Statistics Engine)。它长在ISP管线里,位置通常在demosaic和gamma校正之后。
它的工作方式很简单:
- 对每个像素或像素块计算亮度梯度
- 累加整个窗口内的梯度值
- 输出一个或多个统计值给CPU
你想想看,CPU只需要读几个寄存器,就能拿到整幅画面的对比度信息。这比在CPU上逐像素算快了两个数量级不止。
核心优势:硬件统计引擎不占用CPU周期,统计结果在每一帧的VBlank期间就已经准备好了。CPU在VSYNC中断里读一下就行,零等待。
我习惯把这类引擎的输出叫做“硬件AF统计值”。它通常包含:
- 亮度高频能量——边缘锐度的直接体现
- 区域统计直方图——用于判断场景亮度分布
- 峰值位置——部分高端ISP会直接给出最大对比度位置
3.2 硬件窗口配置:别让引擎算没用的地方
硬件统计引擎虽然快,但它不会自己判断该算哪里。你得告诉它:哪些区域是你要对焦的。
这就是硬件窗口配置要做的事。
我见过不少工程师,直接把整幅画面丢给统计引擎。结果呢?天空、墙壁、纯色背景这些没纹理的区域,把统计值稀释得一塌糊涂。对焦马达来回跑,就是锁不住。
避坑指南:我曾经在一个户外项目上,窗口设成了全画面。晴天还好,一到阴天,整个画面灰蒙蒙的,对比度统计值几乎没变化,对焦直接失效。后来把窗口缩小到画面中央1/4区域,问题立刻解决。
窗口配置的几个关键参数:
| 参数 | 说明 | 我的建议 |
|---|---|---|
| 窗口起始坐标 (X, Y) | 统计区域的左上角 | 避开画面边缘,那里畸变和噪声最大 |
| 窗口宽度、高度 | 统计区域的大小 | 建议占画面1/4到1/2,别太小也别太大 |
| 子窗口数量 | 部分ISP支持多个子窗口 | 多窗口适合多目标对焦,但配置复杂 |
| 权重矩阵 | 窗口内不同位置的权重 | 中央权重高,边缘权重低,模拟人脸对焦 |
嗯,这里要注意:窗口配置不是设一次就完事了。变焦、场景切换、物体移动,都可能需要动态调整窗口位置和大小。
3.3 DMA传输优化:别让数据堵在路上
硬件算好了,窗口也配好了,统计值怎么给CPU?
走DMA(Direct Memory Access)。
DMA的好处是:不经过CPU,直接在ISP和DDR之间搬数据。但DMA用不好,反而会成为瓶颈。
我踩过的一个坑:统计值数据量不大,但每次DMA传输都要重新配置描述符。结果DMA配置开销比传输本身还大。后来改成“一次配置,循环传输”的模式,效率直接翻倍。
优化技巧:使用DMA的“链表模式”(Scatter-Gather DMA)。把多个统计值缓冲区的描述符链成一条链表,DMA会自动逐个传输。CPU只需要在链表末尾加一个中断通知,不用每传一次就中断一次。
DMA传输优化的几个要点:
- 缓冲区对齐:DMA通常要求缓冲区地址按32字节或64字节对齐。不对齐的话,要么报错,要么性能骤降。
- 突发传输长度:根据总线宽度设置合适的突发长度。128字节的突发通常比32字节效率高。
- 中断合并:多个统计值传输完成后,只触发一次中断。别让CPU被频繁中断淹死。
- 缓存一致性:DMA写DDR,CPU读DDR,中间有cache问题。记得做cache invalidate,否则读到的是脏数据。
说白了,DMA优化就是让数据流动起来,别让CPU在中间当搬运工。
3.4 整体流程:硬件加速的AF数据通路
把上面三个模块串起来,就是一条完整的硬件加速AF数据通路:
整个流程里,CPU只做两件事:
- 在初始化时配置窗口参数和DMA描述符
- 在每一帧的VSYNC中断里读取统计值
剩下的,全交给硬件。这才是真正的“硬件加速”。
性能对比:纯软件方案,VGA分辨率下CPU占用约15-20%。硬件加速方案,同样分辨率下CPU占用不到1%。1080p下差距更明显,软件方案基本跑不动,硬件方案依然游刃有余。
最后说一句:硬件加速不是万能的。窗口配错了,DMA配置错了,照样白搭。但只要你把这三个模块调顺了,反差对焦的速度和稳定性,会上一个台阶。