多屏调度核心概念:显示输出接口、帧缓冲管理、合成器与图层
各位同学,今天我们来聊聊多屏调度里最基础、也最绕不开的几个概念。说实话,我刚入行那会儿,也被这些术语搞得晕头转向。什么DP、eDP、MIPI DSI,听着像密码一样。后来在项目里踩过坑,才慢慢理清楚它们之间的关系。
嗯,咱们一个一个来拆解。
显示输出接口:DP、eDP、MIPI DSI
显示输出接口,说白了就是芯片和屏幕之间的“数据管道”。你想想看,芯片处理完图像数据,总得有个方式把数据送到屏幕上吧?这些接口就是干这个活的。
我个人习惯把接口分成两大类:一类是给大屏用的,比如仪表盘、中控屏;另一类是给便携设备用的,比如手机、平板。为什么这么分?因为它们的带宽、功耗、走线长度都不一样。
| 接口类型 | 典型应用 | 带宽 | 最大分辨率(参考) | 特点 |
|---|---|---|---|---|
| DP(DisplayPort) | 中控大屏、副驾屏 | 高(HBR3可达32.4Gbps) | 4K@120Hz / 8K@60Hz | 长距离传输、支持多流 |
| eDP(Embedded DP) | 仪表盘、内嵌屏 | 中高(与DP类似) | 4K@60Hz | 低功耗、走线少、适合板内 |
| MIPI DSI | 后座娱乐屏、小尺寸屏 | 中等(4-lane约6Gbps) | 2K@60Hz | 低功耗、引脚少、适合移动端 |
这里有个坑,我必须要提醒大家。我在项目中遇到过,有人把MIPI DSI的走线拉得太长,结果屏幕闪得跟鬼片一样。MIPI DSI天生就是为短距离设计的,一般不超过30厘米。你要是想驱动后座那块大屏,老老实实用DP或者LVDS转接。
帧缓冲(Framebuffer)管理
帧缓冲,你可以把它理解成一块“画布”。芯片把要显示的内容画在这块画布上,然后显示控制器定时把画布上的内容刷到屏幕上去。
在多屏系统里,事情就没那么简单了。每个屏幕都需要自己的画布,甚至一个屏幕可能需要多块画布(比如画中画、分屏显示)。
我一般把帧缓冲管理分成三个层次:
- 物理帧缓冲:实实在在的内存区域,每个像素点对应一个内存地址。比如一个1080p的屏幕,32位色深,那一个帧缓冲就需要1920×1080×4 ≈ 8MB的内存。
- 逻辑帧缓冲:操作系统抽象出来的概念。应用程序往逻辑帧缓冲里写数据,至于数据最终怎么映射到物理内存,由驱动和硬件来管。
- 双缓冲/三缓冲:为了避免屏幕撕裂,我们通常不会让应用程序直接往正在显示的帧缓冲里写数据。而是准备两个或三个缓冲,轮流使用。
为什么会这样?你想想看,如果只有一个缓冲,应用程序正在往里面画图,显示控制器同时也在读这个缓冲往外送数据。画到一半的数据被读走了,屏幕上就会出现撕裂线。嗯,这画面我见过太多次了。
合成器(Composer)与图层(Layer)
图层这个概念,用过Photoshop的同学应该不陌生。每个图层可以独立更新,最后合成器把它们叠在一起,输出最终的画面。
在座舱系统里,图层是怎么用的呢?我给你举个例子:
- 底层图层:显示地图背景,更新频率低,比如1秒更新一次。
- 中间图层:显示导航箭头、路况信息,更新频率中等,比如10帧/秒。
- 顶层图层:显示警告图标、来电提醒,更新频率高,比如60帧/秒。
合成器的工作,就是把这三个图层按照Z序(深度顺序)叠加起来。硬件合成器(如高通骁龙座舱平台的Display Processing Unit)可以直接在硬件层面完成这个操作,不占用CPU资源。
我记得在某个项目中,客户要求仪表盘上同时显示导航地图、车速数字、以及一个动态的3D车模。如果全部用软件合成,CPU负载直接飙到80%。后来我们启用了硬件合成器,把3D车模作为一个独立图层,CPU负载降到了15%。
三者之间的关系
最后,咱们把这三个概念串起来。你想想看,一个完整的显示链路是这样的:
应用程序 → 帧缓冲(Framebuffer) → 合成器(Composer) → 显示输出接口(DP/eDP/MIPI DSI) → 屏幕
应用程序把内容画到帧缓冲里,合成器把多个帧缓冲的内容叠加成一个完整的画面,然后通过显示输出接口送到屏幕上。
在多核异构芯片里,这个链路会更复杂一些。比如,仪表盘的帧缓冲可能放在Cortex-R核管理的安全内存里,中控屏的帧缓冲放在Cortex-A核管理的Linux内存里,而合成器可能是一个独立的硬件模块,需要从不同内存区域读取数据。
嗯,这里要注意,不同核之间的内存访问延迟是不一样的。我在项目中遇到过,因为跨核访问帧缓冲,导致合成器读取数据时出现超时,屏幕闪了一下。后来我们用了共享内存池,才解决了这个问题。
好了,今天的内容就到这里。下一章我们会深入聊聊,如何在异构多核芯片上实际搭建一个多屏显示系统。到时候我会拿一个真实的芯片平台来演示,敬请期待。