进行了一些QNX编程的学习后,开始尝试QNX图形编程。在文本界面上输出各种字符串确实有点枯燥,很希望在QNX系统上显示一些图形界面。
首先看了一下资料,了解有那些方法可以实现图形编程。QNX官方文档里有三本是和图形相关的。
第一本是:《QNXR Neutrino Device Drivers,Graphics Devices》,一看就不对劲,这本书是有关图形设备驱动的,现在还没有这么高的水平写硬件驱动。
第二本是《Photon microGUI Programmer’s Guide》,是有关Photon窗口界面下的Photon应用开发的,需要Photon的支持,我的BeagleBoard上还没有跑上Photon呢,先不考虑。
第三本是《Advanced Graphics Developer’s Guide》,虽然写着是“高级”图形开发,看内容却和我希望完成的工作接近,就是如何通过QNX的API在屏幕上画图。
而且,《Advanced Graphics Developer’s Guide》一书还讲述了QNX的图形框架 GF(Graphics Frame),描述了QNX图形框架GF,Photon,底层驱动,第三方图形应用之间的关系。所以《Advanced Graphics Developer’s Guide》是QNX上图形开发人员必读的一份资料。
下面结合我自己的理解讲一下QNX的GF。
GF是QNX平台上提供的图形框架,所谓图形框架,就是将底层的驱动调用封装起来,向上提供一些图形接口,让开发人员可以通过简单的API调用实现绘图功能,而不需要关注底层的硬件设备。
下图是QNX GF的架构图:
从上图中可以看到,架构的最底层是硬件,图形的显示最终是由硬件完成的。
与硬件交互的是很多动态库(devg-*.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调用的基本过程如下:
1.通过gf_dev_attach()连接显示设备
2.通过gf_display_attach()连接显示设备(由第1步中获得)的其中一个显示器或者多个显示器
3.通过gf_layer_attach()连接指定显示器(由第2步中获得)的显示层
4.通过gf_surface_create_layer()在指定显示层(由第3步中获得)中创建绘画表面
5.通过gf_context_create()创建一个绘画环境
6.通过gf_context_set_surface将绘画环境(由第5步中获得)和绘画表面(由第4步中获得)连接起来
7.通过gf_draw_rect()等方法在绘画环境(由第6步中获得)中绘制出对应形状。
可以看到以上的步骤是有依赖关系的,完成了以上的所有步骤才能开始在QNX上绘制内容。
看起来有点麻烦,不过思路已经理清了,应该问题不大,明天有时间开始写代码测试一下,有结果后再和大家共享。