在Linux下仿真软件Carla中渲染好图像后往HDMI/DP显示器输出一般有两种办法:
基于xrandr多桌面管理,渲染好画面后像显示在桌面一样往HDMI/DP显示器输出,因为多了操作系统的xrandr这个桌面管理中间商会让延迟很大
直接绕过操作系统直接基于vulkan驱动绑定显卡HDMI口,图像在显卡中渲染好之后直接往HDMI口输出,性能最优且延迟最小
今天我要聊的就是第2种基于vulkan驱动的方案。下面是我们的HIL-Sim台架基于vulkan驱动单显卡实时渲染2路camera,然后通过显卡的2个HDMI口输出到2路显示器,模拟暗箱测试环境的效果:
这个基于vulkan驱动的方案图像链路延迟比实车camera延迟慢43.3ms~70ms左右(不考虑撕裂情况),具体组成分为:
ue4渲染时间:这里假设一个最差值33.3ms,如果渲染稳定小于33.3ms还能进一步优化
ue4渲染图像往vulkan驱动的显卡HDMI输出缓存拷贝,显卡直接传输图像句柄,包括缩放在内的延迟都很低,这里假设一个最差值3.3ms
显卡HDMI输出缓存往显示器输出,这里假设显示器刷新率30Hz对应一个最差值33.3ms左右,实际上显示器刷新率144Hz对应7ms延迟。
更具体延迟情况分析,请看我之前发的文章“HIL视频注入走PCIe还是HDMI?”
这个方案关键点在于Linux下vulkan驱动有一个限制:同一张显卡下的4个HDMI/DP口只能由同一个进程绑定,我们不能让4个进程分别去绑定4个HDMI口。这就导致一个UE4渲染进程就要占用一个显卡,但是由于只能渲染1路图像所以只能使用1个HDMI/DP接口,剩下的3个HDMI/DP接口用不了。所以最终办法是一张显卡用一个hdmi.service进程来绑定显卡4个HDMI口,然后4个UE4渲染进程渲染好图像之后通过进程间通信把图像句柄传hdmi.service,由hdmi.service进程统一往4个HDMI口输出。hdmi.service刚启动成功绑定显示器之后(此时UE4实例还没渲染图像输出),默认会显示白色屏幕且在中央输出GPU_BUS_ID:HDMI_MODE_ID,如下图:

卡朗仿真科技基于Carla的HIL-Sim台架已经原生支持基于vulkan驱动往HDMI口输出,具体使用方法可以参考我们的SDK文档:https://caronsim.com/docs/chs_doc#%E9%83%A8%E7%BD%B2sdk