热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MiniGUI的帧缓冲技术、图形渲染引擎与输入处理机制

在整理旧文件时,发现了几篇关于2011年MiniGUI技术的博客,虽然内容已显陈旧,但仍然具有一定的参考价值。这些文章详细探讨了MiniGUI的帧缓冲技术、图形渲染引擎以及输入处理机制,为理解早期嵌入式系统的图形界面开发提供了宝贵资料。

清理硬盘时发现有几篇2011年整理的博客躺在那里,删了怪可惜的,发上来保存一下~~

年代久远,已经过时,仅作参考用途~~~


FrameBuffer:

帧缓冲是一种驱动程序接口。FrameBuffer机制模仿显卡的功能,将显卡硬件结构抽象掉,可以通过FrameBuffer的读写直接对显存进行操作。用户可以将FrameBuffer看成是显示内存的一个映像,将其映射到进程地址空间后,可以直接进行读写操作,而且写操作可以立即反应在屏幕上。这种操作是抽象的,统一的。用户不必关心物理显存的位置、换页机制等等具体细节。这些都是由FrameBuffer设备驱动来完成的。但FrameBuffer本身不具备任何运算数据的能力,好比只是一个暂时存放水的水池,CPU将运算后的结果放到这个水池,水池再将结果流到显示器。中间不会对数据进行处理。应用程序也可以直接读写这个水池的内容。在这种机制下,尽管FrameBuffer需要真正的显卡驱动的支持,但所有显示任务都由CPU完成,因此CPU负担很重。

FrameBuffer只是一个提供显示内存和显示芯片寄存器从物理内存映射到进程地址空间中的设备。所以对于应用程序而言,如果希望在FrameBuffer之上进行图形编程,还需要自己动手完成其他许多工作。

 

图形引擎及输入引擎:

在MiniGUI0.3.xx的开发过程中,引入了图形和输入抽象层(Graphics and Input Abstract Layer, GAL & IAL)的概念。抽象层的概念类似Linux内核虚拟文件系统的概念。它定义了一组不依赖于任何特殊硬件的抽象接口,所有顶层的图形操作和输入处理都建立在抽象接口之上。而用于实现这一抽象接口的底层代码称为“图形引擎”或“输入引擎”,类似操作系统中的驱动程序。这实际是一种面向对象的程序接口。利用这种抽象接口,我们可以将MiniGUI非常方便地移植到其他POSIX系统上,只需要根据我们的抽象层接口实现新的图形引擎和输入引擎即可。一般而言,基于Linux的嵌入式系统内核会提供FrameBuffer支持,这样MiniGUI已有的FBCON图形引擎可以运行在一般的PC上,也可以运行在特定的嵌入式系统上。因此,通常我们不需要开发针对特定嵌入式设备的图形引擎,而只要使用FBCON图形引擎即可。同时,MiniGUI还提供了Shadow, CommLCD等应用于不同场合的图形引擎。

但相比图形来讲,将MiniGUI的底层输入与上层相隔显得更为重要。在基于Linux的嵌入式系统中,图形引擎可以通过FrameBuffer而获得,而输入设备的处理却没有统一的接口。在PC上,我们通常使用键盘和鼠标,而在嵌入式系统上,可能只有触摸屏和为数不多的几个键。在这种情况下,提供一个抽象的输入层,就显得格外重要。

 

MiniGUI提供的图形引擎:

1.  Shadow

该引擎的主要功能是:提供对异步更新图形设备的支持,比如无法直接访问FrameBuffer等的情况。用来在NEWGAL之上支持低于8位色的显示模式。目前提供了对QVFB各种显示模式的支持。

2.  MLShadow

    该引擎是实现了了在机顶盒、PMP等产品方案中提供多个显示层,以完成累死硬件提供的图形层叠加功能,自动实现层之间的透明、半透明的显示。该引擎的主要功能是:可以实现多个虚拟图层之间的透明或者半透明叠加,可以将Shadow引擎作为真实引擎,以实现对下于8位色的支持以及实现屏幕旋转的支持。

3.  pc_xvfb

    该引擎的主要功能是:使用同一的启动参数,使MiniGUI可以在初始化时自动启动该xvfb程序。使用统一的共享内存对象键值,是的不论采用qvfb(Qt vfb)还是wvfb(Window vfb)还是gvfb(Gtk+ vfb)程序,都可以让pc_xvfb输入引擎使用同样的键值来获取帧缓冲区的系统共享内存对象。使用统一的关到/Unix socket对象及输入数据传输协议,使得不论采用qvfb还是wvfb还是gvfb程序,都可以让pc_xvfb输入引擎使用同样的机制获得用户在窗口中的输入数据。

4.  rtos_xvfb

借助rtos_xvfb引擎,可将MiniGUI运行在摸个已有的RTOS图形系统之上,比如uC/GUI、Gtk+、Tilcon等。其原理如下:

由rtos_xvfb程序模块创建窗口,分配虚拟帧缓冲区,然后以线程方式启动MiniGUI程序,MiniGUI程序在虚拟缓冲区中绘制,按约定的规范使用环形缓冲区存放rtos_xvfb引擎产生的输入数据,MiniGUI的rtos_xvfb输入引擎提供相关接口。

xVFBAllocVirtualFrameBuffer/xVFBFreeVirtualFrameBuffer      //创建/销毁虚拟帧缓冲区的接口

xVFBCreateEventBuffer/xVFBDestroyEventBuffer                        //创建/释放环形缓冲区的接口

xVFBNotifyNewEvent             //用于向环形缓冲区放入输入事件,并通知rtos_xvfb引擎读取的函数接口

5.  CommLCD

    该引擎的主要功能是为各种操作系统提供可直接访问LCD FrameBuffer设备的支持

 

 

MiniGUI提供的输入引擎:

1.      Comm IAL

MiniGUI为传统嵌入式操作系统提供了Common输入引擎(comm),使用该引擎可以很方便地实现对键盘、鼠标或触摸屏等输入设备的支持。

使用该引擎时,需要根据操作系统或底层驱动由客户自己为MiniGUI实现以下5个函数接口:

int __comminput_init(void);                                                                   //初始化输入设备

void __comminput_deinit(void);                                                             //释放输入设备

int __comminput_ts_getdata(short *x, short*y, short *button);          //返回当前鼠标或触摸屏信息

int __comminput_kb_getdata(short *key, short*status);                      //返回键盘输入信息

int __comminput_wait_for_input(void);                                                //返回输入事件类型

2.      Custom IAL

MiniGUI 3.0专业版和标准版的输入和输出引擎都是飞漫软件定制实现的,如果我们需要自己定制IAL的话,可以使用MiniGUI提供的custom-ial库自定义ial引擎接口的实现。按照下面的方法编写好IAL源代码后,要讲该源代码编译生成一个ial库,最后将实例、minigui库和ial库一起编译,才可以生成正确的可执行文件。Custom输入引擎在customial.h中给我们提供了定制键盘和鼠标消息处理的接口,我们只要实现下面的接口,就可以实现对相关消息的处理了:

BOOL InitCustomInput(INPUT *input, constchar *mdev, const char *mtype);

Void TermCustomInput(void);



推荐阅读
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 本文探讨了 Objective-C 中的一些重要语法特性,包括 goto 语句、块(block)的使用、访问修饰符以及属性管理等。通过实例代码和详细解释,帮助开发者更好地理解和应用这些特性。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 本文详细介绍了如何在BackTrack 5中配置和启动SSH服务,确保其正常运行,并通过Windows系统成功连接。涵盖了必要的密钥生成步骤及常见问题解决方法。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • 本文介绍如何通过注册表编辑器自定义和优化Windows文件右键菜单,包括删除不需要的菜单项、添加绿色版或非安装版软件以及将特定应用程序(如Sublime Text)添加到右键菜单中。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 掌握远程执行Linux脚本和命令的技巧
    本文将详细介绍如何利用Python的Paramiko库实现远程执行Linux脚本和命令,帮助读者快速掌握这一实用技能。通过具体的示例和详尽的解释,让初学者也能轻松上手。 ... [详细]
  • 本文探讨了如何优化和正确配置Kafka Streams应用程序以确保准确的状态存储查询。通过调整配置参数和代码逻辑,可以有效解决数据不一致的问题。 ... [详细]
author-avatar
谁的围脖搞笑排行榜
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有