嵌入式Linux下竖屏显示配置

2019-07-12 17:15发布

By Toradex 胡珊逢 1). 简介 目前大多数设备的显示器是横屏,例如高清分辨率1920×1080、笔记本14寸显示器1366×768以及最近很热门的 4K 分辨率3840×2160。另外一种则是竖屏显示器,常见于娱乐、广告设备,手机最为常见的竖屏设备,以及户外的广告牌、售货机以及汽车的中控显示台等。大部分显示器控制器都可以支持横屏和竖屏,正如在手机和平板上看到的一样。   本文基于Toradex的 Apalis iMX6 计算机模块进行竖屏配置说明,其采用 NXP 的 iMX6 SoC。iMX6 SoC 最多带有两个 IPU 显示控制器,支持LVDS、RGB、DVI/HDMI显示器。每个 IPU 最高支持 1024x1024像素的图像旋转。截至本文撰写时,iMX6的IPU 驱动还只支持垂直翻转,即180°旋转。因此,对于±90°的旋转,需要通过其他途径实现。Apalis iMX6 计算机模块采用基于 Angstrom的 Linux BSP,其采用 X11显示框架。Apalis iMX6 也能够支持 Qt5作为 GUI 框架。在 Apalis iMX6上面可以借助 X11和 Qt5实现竖屏显示。   2). 基于X11的竖屏显示配置 a). X11本身可以通过软件配置,旋转显示的内容。由于 X11 是底层的显示管理框架,因此能够将所有的显示内容都进行统一的旋转。开发人员只需要根据显示区域重新调整内容排列,而不需要重构代码。下面命令将屏幕顺时针旋转90°。 ------------------------ root@apalis-imx6:~# xrandr -o right ------------------------ b). 在显示旋转后,触摸输入需要进行相同的旋转。 ------------------------ root@apalis-imx6:~# xinput set-prop stmpe-ts 'Coordinate Transformation Matrix' 0 1 0 -1 0 1 0 0 1 ------------------------ c). 显示效果如下图所示。
d). 由于显示和触摸输入都做了同样的旋转,应用程序上能够正确响应触摸事件。X11 是通过软件的方式将显示输出进行选择,通过 CPU 运算重新排列输出像素内容。因此效率上低于直接通过显示控制器实现。下面是使用 glxgears测试1024x768 屏幕选择前后的性能。 ./ 正常横屏显示,1024x768 ------------------------ root@apalis-imx6:~# glxgears -fullscreen 1101 frames in 5.0 seconds = 220.045 FPS 1073 frames in 5.8 seconds = 186.566 FPS 1090 frames in 5.0 seconds = 217.848 FPS 1092 frames in 5.0 seconds = 218.238 FPS 1093 frames in 5.0 seconds = 218.413 FPS ------------------------ ./ 竖屏显示,768x1024 ------------------------ root@apalis-imx6:~# glxgears -fullscreen 456 frames in 5.0 seconds = 91.079 FPS 578 frames in 5.0 seconds = 115.483 FPS 598 frames in 5.0 seconds = 119.456 FPS 513 frames in 5.0 seconds = 102.499 FPS 415 frames in 5.0 seconds = 82.989 FPS ------------------------   从测试结果看,经X11 旋转后,在同样的分辨率下,性能下降近一半。由于这是通过软件方式实现,随着屏幕分辨率上升,性能会进一步下降。对于复杂 UI(特别是有3D效果)或者对输出帧率有要求的应用,X11 旋转屏幕并不是理想的方法。简单交互 UI的应用,例如按键控制、文本、图片显示的应用,X11旋转屏幕的开销并不会明显影响用户使用体验。   2). 基于QT的竖屏显示配置 如果追求绚丽 UI的应用,在 Apalis iMX6 可以使用Qt5 作为 UI 框架。从Qt5开始,QML 可以借助 OpenGL在 GPU 渲染,不仅可以获得更高的效率,还可以释放CPU 资源,使其处理其他的逻辑运算,提高应用运行的流畅性。   a). 在Qt中可以直接将顶层窗口旋转,其内部的子组件也会按同样的方向旋转,如下面所示
b). 显示效果如下:   c). 对于部分无法直接继承顶层窗口的旋转属性,则需要单独调整。Qt 提供QTransform Class实现更多的旋转效果。由于只进行Qt应用显示的旋转,触摸输入并未发生变化,因此Qt 应用仍然能正确响应触摸事件。 d). 在 GPU 上渲染的QML内容,能获得更好的运行效果。QtWidget应用无法在 GPU 上渲染,只能通过软件的方式进行旋转。   3). 总结 竖屏应用的需求,除了上面提到交互 UI 外,另一类则是视频显示。同样,X11可以直接将所有内容旋转,但也会面临性能问题,在这高分辨率视频、多路视频同时显示方面会尤为明显。在 Apalis iMX6 平台上,gst-1.0的imxg2dvideosink 组件,可以将视频内容通过 OpenGL 直接显示,并避免X11垂直同步的问题。   综上所述,用户可以利用X11,只需修改内容排版,即可实现竖屏应用。或者使用Qt5 UI 框架,在应用内旋转输出内容。对于需要高级视觉效果的UI,或者高清视频显示应用,X11 的软件旋转并不是理想的方案。那些带有支持 OpenGL的 GPU 计算机模块,能提供更好的用户体验。Toradex的Apalis Tegra K1、Apalis/Colibri iMX6、Apalis/Colibri T30以及下一代产品Apalis iMX8 QuadMax 计算机模块均能够支持 OpenGL,同时具有不同配置,能够满足不同项目的需求。