QNX上的图形开发环境简介
现在的QNX,基本上有三种(四种?)图形开发用的环境可选:
- 传统的Photon。这个可以像windows那样提供组件,并且有phab图形开发环境。是个完整的窗口系统。(窗口的大小,重叠什么的都有window manager来管理)。Photon的优点是开发相对容易(有工具);缺点是代码量比较大,而且因为历史的原因,有一些新的图形功能无法在Photon里实现。
- GF(Graphics Framework)。GF说白了就是一个小巧、高速的图形库。与图形驱动非常地贴近,从而能有效,最大限地利用显示芯片的硬件能力。它优点是小巧,高速,因为很多嵌入式的界面其实不需要”窗口管理“。但缺点是不象Photon那样有系统组件,什么都得自己来,也没什么特别的编程工具。在GF之上,有新开发的Composite Manager,这个主要是用软件来管理不同的图层,基础还是GF。但框架用了许多OpenKode的东西。
- 第三种图形界面就是Adobe Flash/Air了。QNX移植了Adobe Flash Player,所以你可以直接用Adobe工具,编一个.swf文件做为你的图形界面。优点是这种界面不依存于操作系统(能跑Flash就能用);缺点是在嵌入式设备上跑性能还有待提高。这个,基本上也是QNX的发展方向,PlayBook应该就是用的这个。
在6.4x以前,GF与Photon是不兼容的;要用GF,就得退出Photon,直接在文本模式(text mode)运行GF程序。在/usr/bin里应该有一些gf的例子。像是vsync,跑一下就知道了。到6.5,这几种图形环境又融合起来了。以GF打底,Photon变成了一个基于GF的窗口系统 ;而Flash Player也是基于GF的一个程序而已。
关于QNX图形系统的文档资源,QNX官方文档里有三本是和图形相关的。
第一本是:《QNXR Neutrino Device Drivers,Graphics Devices》,这本书是介绍图形设备驱动开发的。
第二本是《Photon microGUI Programmer’s Guide》,是有关Photon窗口界面下的Photon应用开发的,需要Photon的支持。
第三本是《Advanced Graphics Developer’s Guide》,讲述了QNX的图形框架 GF(Graphics Frame)以及 GF,Photon,底层驱动,第三方图形应用之间的关系。所以《Advanced Graphics Developer’s Guide》是QNX上图形开发人员必读的一份资料。
GF 简介
GF (QNX Graphics Framework)是一个用于创建用户界面的图形库,区别于普通的窗口系统(windowing system),它非常小巧,耗费的系统资源也非常少。
GF 直接访问图形驱动,渲染时没有消息传递或者上下文切换,并且可以使用硬件加速功能,因此非常适合嵌入式系统。
GF 支持 OpenGL ES 1.0,可满足嵌入式 3D 图形开发的需求。
GF应用程序的架构
 |
| GF Application 架构 |
除了 GF 提供图形功能外,键盘鼠标输入由io-hid管理,字体渲染由字体渲染系
统(如 BitStream's Font Fusion library)处理,图像装载由专门的图像库(如
Neutrino image library )处理。
GF 框架架构图
GF 基于 client/server 架构。作为 server,io-display 负责管理设备资源
(如分配和释放显存)和硬件访问。客户端(gf app)直接渲染到硬件。客户端通过
调用 gf_draw_begin() 来获得锁以保证一次只有一个线程/应用访问硬件资源。
同时,io-display 也处理不正常的客户端,增加了系统的鲁棒性。
 |
| gf 体系结构 |
从上图中可以看到,架构的最底层是硬件,图形的显示最终是由硬件完成的。
与硬件交互的是很多动态库(devg-XXX.so),它们就是驱动程序。
在QNX上有模块io-display可以通过驱动程序使用硬件设备。
而QNX的GF(Graphics Framework)一方面通过io-display模块与驱动程序交互,另一方面也直接和驱动程序交互。
有了GF,开发人员就可以忽略不同硬件的差别,还可以省去与驱动程序交互的繁琐工作,直接调用GF 的API进行图形绘制。通过GF可以实现的包括画点,画线,画圆等等,通过这些工具开发人员就可以开发复杂的应用了。记得曾经在哪里看见过一个牛人说过,只要有画点的函数,我就可以做一个窗口系统出来。
当然,直接通过画点,画线完成复杂系统会比较麻烦,一般会对基本功能进行封装,这就是图中的“Third-party 2D library”部分。
另外,从架构图我们也可以看到,QNX的图形窗口系统Photon也是通过GF的调用完成的。可以将Photon理解成QNX封装好的高级图形接口,而且是居于窗口系统的。开发人员可以通过Photon的API简单地实现程序窗口的绘制,不需要从画点开始做一个窗口系统。
而OpenGL ES 部分有些不同,OpenGL ES模块除了调用GF外,它还同时和硬件驱动直接交互,因为3D显示需要更底层的调用才能实现更快速的计算。
在不考虑Photon编程和OpenGL编程的情况下,在QNX环境中实现图形编程就是通过调用GF接口完成的。
从《Advanced Graphics Developer’s Guide》书中可以看到GF调用的基本过程如下:
- 通过gf_dev_attach()连接显示设备
- 通过gf_display_attach()连接显示设备(由第1步中获得)的其中一个显示器或者多个显示器
- 通过gf_layer_attach()连接指定显示器(由第2步中获得)的显示层
- 通过gf_surface_create_layer()在指定显示层(由第3步中获得)中创建绘画表面
- 通过gf_context_create()创建一个绘画环境
- 通过gf_context_set_surface将绘画环境(由第5步中获得)和绘画表面(由第4步中获得)连接起来
- 通过gf_draw_rect()等方法在绘画环境(由第6步中获得)中绘制出对应形状。
可以看到以上的步骤是有依赖关系的,完成了以上的所有步骤才能开始在QNX上绘制内容。
SeeAlso
- 如何正确使用GF编程画图 新手图形奠基
- 开始QNX上的图形编程,了解GF
- Overview of the QNX Graphics Framework (GF) architecture
|