Qt提供的图形化工具可以很方便地开发车载数字座舱中图形化界面。同时Qt for Android Automotive将Qt技术、车载信息娱乐系统以及安卓平台三者进行集成,提供Java API的Qt/C++封装,为开发团队提供易于使用的、可靠稳定的Android IVI的底层接口。
Qt 中国资深技术顾问 林斌
作为国际知名软件,Qt已发展了26年,在各行各业都有广泛的应用,公司总部位于芬兰,主要提供图形化开发框架和渲染引擎。目前,Qt公司在赫尔辛基纳斯达克是上市,每年保持30%-40%的成长率。
在汽车行业,Qt服务众多客户、项目,全球有几个标杆性的用户,一个是梅赛德斯奔驰,MBUX全系列的数字座舱系统都是基于Qt平台开发;特斯拉的数字座舱也是基于Qt开发;以及福特、现代等等。国内的厂商也有较多合作,如上汽大众,广汽等等,Tier One包括延锋伟世通和德赛西威。
极致渲染
Qt本身是非常庞大的体系架构,涵盖桌面的应用程序开发,嵌入式或者智能穿戴都有对应的解决方案。提供多种开发方式。在数字座舱上用的比较多的开发方式,一个是基于Qt Quick技术的2D和3D的UI,另一个是Qt支持Web UI,Qt内置的浏览器,可以在Qt界面上嵌入HTML的内容。
林斌介绍了最重要的部分——Qt Quick渲染引擎/图形技术。该技术首先是一种开发语言 QML,它也是一个渲染引擎,可以同时渲染2D和3D内容。这是Qt和很多厂家的技术不一样的地方,它统一了2D和3D设计工具,设计团队可以很方便地拖拽,把画面组合起来。
林斌介绍了Qt展示的流程图/软件架构图是完整Qt Quick技术的渲染总线。值得一提的是2D的渲染引擎,为什么有独立的2D渲染引擎?是因为2D场景也是由GPU渲染的,但是2D场景的一些需求和3D场景不一样,2D场景会产生大量碎片化的图元,需要对它做一些批次整合,或者做一些性能的优化,它的渲染效率才会大大提高。总之,如果用GPU渲染2D场景,必须要有这种专业的引擎。
除了2D渲染引擎,Qt还提供3D的渲染引擎专门用于渲染3D场景下的内容,它的优化逻辑和算法和2D是不一样的。Qt能做到2D和3D完整的解决方案。Qt现在GPU的渲染会基于OpenGL的标准,大多数的软件都是基于OpenGL标准进行开发,但是OpenGL已经算是上一代的架构了,以Vulkan为代表的新一代的技术架构已经有了取代的趋势,未来五到十年,两者会并存。Qt在引擎的输出部分做了一层渲染硬件接口,不会直接对接OpenGL或Vulkan,而是以插件的形式让用户自由选择,客户可以不修改一行代码,直接通过环境变量切换不同输出。
从3D的性能方面而言,Qt可以支持先进的光照算法,基于图片的光照技术(IBL)等技术,满足汽车App的需求。
如图,不停旋转的球是另外一个技术——真实物理渲染(PBR)技术,它可以非常高精度的模拟真实的金属或者物体表面的反光情况,还是在那个案例里面,如果有一个car body control的车模,车模表面的反射或者一些倒影都可以用这个技术完全可以实现。
Qt可以动态生成顶点,动态生成材质,针对汽车行业很典型的地形生成需求,即ADAS或者一些车载导航的道路周边需要有一些随机生成的地形, Qt完全支持该功能,可以随机生成或者加入一些算法生成地图。
Qt后期着色器可以给画面增加一些变化,比如说我整个画面要做一些动态的模糊,或者配合你的主题颜色要做一些变色。
在开发当中普遍问到一个问题,车载3D的图形界面对画面的精细度要求非常高,完美度要求非常高,所以Qt Quick也加入了丰富全面抗锯齿的功能。
Qt提供了非常专业的两个独立渲染引擎,也就是说Qt可以实现在同一个原代码里面既编辑2D又编辑3D,3D和2D控件混合的状态,或者是可以在同一个直角坐标系里面绘制3D和2D的原件,把2D的文字或者照片浮空显示,有一个3D车模或者3D的模型从前到后不停进行穿越。
此外,从Qt6.0开始,Qt支持骨骼动画、支持变形动画和3D粒子效果。
完整工具链 确保及时高质量交付
Qt的工具也是非常重要的部分,其提供了业内最完整的工具链。
第一,Qt提供了Designer Tools,就是Qt的设计师工具,提供简单的托托拽拽,编辑关键帧就可以实现动画的工具,这是在前面设计端。
第二,Qt也提供了Developer Tools,可以用来编写代码、编译和调试。
第三,Qt支持自动化的测试工具,Qt有集成自动化回归测试的小工具,这样的话Qt编写一些测试脚本,放在Qt的CI/CD工具里面,这样每开发一次,或者每提交一次代码可以进行完整的自动测试。从而提高开发结果的质量,也缩短开发时间。
Qt的设计工具Design Studio,有几个功能。
一是可以支持素材导入。2D的素材包括Photoshop、Illustrator、Sketch、Figma等,把工具开发出来的UI直接转换成Qt的代码。
二是生成了这个场景就可以编辑它的动画,编辑它的状态机,实现简单的场景拼接。这个版本Qt还对3D开发进行了一些优化,包括它的可视化3D粒子效果的编辑,包括它的PBR高级材质编辑,以及自定义着色器的编辑。
Qt的测试工具,细分Qt三个产品:
第一是Squish,是一个自动化回归测试工具。
第二是COCO,代码覆盖率的统计工具,有多少代码是被测试过的,有多少代码是被运行过的,有多少代码是死代码,都可以通过这个工具进行分析,进行优化。
第三是Test Center,测试结果管理工具,是一个服务,可以把前面生成的所有测试报告放在这里面。
这是Qt测试工具的集合。
整合安卓
十年之前就可以把整个Qt的程序放在安卓上,该产品叫做Qt for Android。Qt可以用Qt的开发工具去开发安卓的APP,开发出来的程序可以通过安卓的NDK进行编译,打包生成Apk。
Qt for Android Automotive可以把整个Qt UI封装成一个Surface,可以内嵌到原生Android Activity显示。Qt也可以设置它做成系统顶层,这样可以变成一个浮动窗口,浮动在任何界面上。典型的应用比如一些3D的交互头像,做一些人机对话功能,或者是做一些3D方面的信息推送。
另一大类是关于IVI Launcher,IVI桌面系统,安卓用于汽车的桌面开发其实会对桌面有非常特殊的要求,Qt希望安卓的APP变成一个卡片。一般的安卓APP一旦启动的时候是全屏运行的,Qt想把安卓的APP变成一个窗口或者卡片运行在桌面上,这样Qt就可以在桌面上运行很多很多的APP,用窗口组合形势进行管理。因此,Qt打造了这个桌面系统,安卓原生的APP一旦启动之后,它变成了一个卡片或者是小窗口运行在桌面上,这个窗口还可以自定义布局方式。其中运用了Qt窗口管理模块的技术,以及修改了安卓原生,把这个生命周期修改成它可以并行运行的状态。视频中有四个应用程序,而且这四个都是原生的,窗口也可以拖拽,进行位置或者顺序的替换等等。
Qt在安卓上还有另一种方案。现在数字座舱一般会使用Hypervisor的虚拟机去做操作系统的隔离,资源的隔离,但有些车厂会觉得Hypervisor比较贵,技术支持上还是有些问题,能不能找一个Hypervisor的替代方案?
Qt就把目光放在了Linux内核,它自带了Container机制,即LXC技术。Container能实现什么呢?应用程序的独立分离。Qt可以基于Container概念打造技术方案,安卓底层就是Linux,安卓底层的Linux上运行两个容器,一个容器直接运行Linux,输出的是仪表盘界面,另外一个容器运行安卓应用组件,形成安卓的生态。这两个容器之间可以实现进程间的隔离。
全栈服务
Qt的愿景就是适配各种各样的方案架构,打造一个完整的、统一的用户体验。Qt在仪表盘上适配多种操作系统,Qt也可以在安卓上完美地适配开发应用程序。同样,Qt还提供了一个Qt for MCUs模块,在低端的单片机上直接运行Qt UI,基于这个技术可以打造Console的界面。更关键的一点是所有平台可以统一使用同一种语言,只要写一遍代码就可以在各个平台上直接运行,这有助于开发人员打造一个完整统一的用户体验座舱。