热门标签 | 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 操作实例。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 深入理解Tornado模板系统
    本文详细介绍了Tornado框架中模板系统的使用方法。Tornado自带的轻量级、高效且灵活的模板语言位于tornado.template模块,支持嵌入Python代码片段,帮助开发者快速构建动态网页。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
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社区 版权所有