热门标签 | 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);



推荐阅读
  • 7.2 利用关系运算符与表达式进行数值对比分析
    在C语言中,关系运算符和表达式是进行数值对比分析的基础工具。本节详细介绍了真值的概念及其在编程中的应用,包括布尔类型(_Bool)的引入,以及关系运算符的优先级。通过具体示例,展示了如何在 `while` 循环中使用关系表达式来控制程序流程。这些内容对于理解和编写高效的条件判断逻辑至关重要。 ... [详细]
  • Oracle程序包基础入门:了解核心概念与基本结构
    本文旨在为初学者介绍 Oracle 程序包的基础知识,涵盖其核心概念和基本结构。通过详细解析程序包的组成元素,如过程、函数和变量,帮助读者理解如何在实际应用中有效使用 Oracle 程序包。此外,文章还提供了实例代码,以便读者更好地掌握这些关键概念。 ... [详细]
  • 软件开发史上最具影响力的十位编程大师(附图解)
    在软件开发领域,有十位编程大师对行业发展产生了深远影响。本文基于国外知名社区的一项评选,通过图文并茂的形式,详细介绍了这十位杰出人物,包括游戏开发先驱John Carmack等,为读者呈现了他们卓越的技术贡献与创新精神。 ... [详细]
  • 本文介绍了如何利用摄像头捕捉图像,并将捕获的图像数据保存为文件。通过详细的代码示例,展示了摄像头调用的具体实现方法,适用于多种应用场景,如安全监控、图像处理等。 ... [详细]
  • 在 Linux 环境下,深入探讨 GTK+3.0 的高级开发技巧,涵盖组件定制、事件处理及多线程应用等核心内容,帮助开发者提升应用界面的交互性和性能。 ... [详细]
  • 在《物联网内核与驱动开发基础课程》第五讲中,详细解析了平台总线技术的应用与开发。本讲内容不仅涵盖了平台总线的基本概念,还深入探讨了其在嵌入式系统中的实现方法及优化策略,为开发者提供了宝贵的实践指导。通过具体案例分析,帮助学员更好地理解平台总线在设备管理、资源分配等方面的关键作用。 ... [详细]
  • 本文介绍了如何利用 `boost::asio` 库实现高效的异步 TCP 编程。与传统的同步方式不同,异步编程允许程序在发起 I/O 操作后立即返回,继续执行其他任务,从而显著提高系统的响应速度和整体性能。通过具体的代码示例和详细解释,本文展示了如何在实际应用中充分利用 `boost::asio` 的强大功能,实现高效、可靠的网络通信。 ... [详细]
  • 本文将深入探讨Python的Tulip网络库(即3.4版本后更名为asyncio)的实现机制。通过详细解析Tulip的工作原理,旨在帮助读者理解其如何高效处理I/O阻塞问题,并展示其实现非阻塞流程的具体方法。 ... [详细]
  • 本文通过复旦大学自然语言处理课程中的一个具体案例,详细解析了中文词汇分割技术的实现方法。该案例利用Java编程语言,结合词典和算法模型,展示了如何高效地进行中文文本的词汇分割,为相关研究和应用提供了宝贵的参考。 ... [详细]
  • 本文详细探讨了 Java 中定义宏的方法,并与 C++ 中的 `#define` 用法进行了对比。通过具体示例,深入解析了两者在预处理阶段的不同机制及其应用场景,帮助开发者更好地理解和选择合适的宏定义方式。 ... [详细]
  • Nginx入门指南:从零开始掌握基础配置与优化技巧
    Nginx入门指南:从零开始掌握基础配置与优化技巧 ... [详细]
  • C/C++利用栈和队列实现停车场管理系统【C++教程】
    数据结构的课程设计一般都不是很好理解,今天小编为大家总结了一下c和c++版本的常见栈和队列的的停车场管理程序,需要 ... [详细]
  • 一键将应用部署至远程服务器,体验超乎想象的便捷与高效
    该插件作为IDEA的内置功能,用户可以直接启用,无需额外安装。通过简单的配置,即可实现应用的一键部署至远程服务器,极大地提升了开发效率和便捷性。插件支持镜像管理和容器管理,允许用户与容器进行交互,并且兼容Docker Compose,适用于复杂的多容器应用部署。总结部分详细介绍了插件的使用方法和优势,附带的参考资料和项目源码地址为用户提供更多学习和实践资源。 ... [详细]
  • 在使用 PHP 通过 SSL 安全连接到 MySQLi 数据库服务器时,遇到了一些技术难题。我的环境包括一个 Web 服务器和一个数据库服务器,两者均使用 OpenSSL 生成了证书。尽管证书内容一致,但在尝试从 Web 服务器使用 `mysql` 命令进行连接时,仍然遇到了问题。为了确保连接的安全性和稳定性,需要进一步检查证书配置和 PHP 的 SSL 设置,以排除潜在的配置错误或兼容性问题。 ... [详细]
  • Java NIO Buffer详解及其优势与局限性分析 ... [详细]
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社区 版权所有