前言
上一篇文章主流嵌入式开源GUI比较,对比了MicroWindows、MiniGui、QT、GTK+、OpenGUI和FLTK等GUI框架,其实还有一些框架没有列出来,或者网上资料比较少,搜索不到。这篇文章再介绍一些,有EFL(Enlightenment Foundation Libraries),AWTK(Toolkit AnyWhere),Wayland/Weston,SDL(Simple DirectMedia Layer),DirectFB,LittlevGL,Nuklear
1 EFL
1.1 EFL简介
Enlightenment Foundation Libraries (EFL) 驱动 Enlightenment,它们也可以独立使用或者构建在其他库之上,提供有用的功能并创建强大的应用程序,核心库EFL在速度和大小方面都比其GTK+和Qt等效率更高,并且具有更小的内存占用量,EFL大部分的模块开源协议都是BSD和LGPL v2.1
Enlightenment始于1996年,作为构建X11窗口管理器的项目。从那时起,已经发展了很多,Enlightenment仍然产生了Window Manager,该项目目前正在从X11过渡到Wayland。官方努力开发,最终转向Wayland,因为它是Linux上图形显示层的未来
在开发Window Manager时,还开发了一组库。这些库统称为EFL。 它们涵盖了从主循环到图形,场景图,网络,小部件,数据存储,IPC等一系列功能
EFL是用C语言编写的,默认情况下支持在C中所有公共API。绑定支持存在多种语言,包括Python,C++和Lua。随着基于对象的Unified API的完成,将提供更多语言绑定
官方仍主要支持Linux for Enlightenment,但也有一些努力(基于用户和一些开发人员的帮助和支持)来支持BSD,以及macOS和Windows
稳定的EFL API组件模块,核心EFL组件包括:
组件 | 说明 |
---|---|
Evas | Core scene graph and rendering |
Eina | Data structures and low level helpers |
Edje | UI layout & animation data files for themes |
Eet | Data (de)serialization and storage |
Ecore | Core loop and system abstractions like X11 |
Efreet | standards handling |
Eldbus | D-Bus glue and handling |
Embryo | Tiny VM and compiler based on Pawn |
Emotion | Video decode wrapping, glue and abstraction |
Ethumb | Thumbnailing handler |
Ephysics | Physics (bullet) wrapper and Evas glue |
EIO | Asynchronous I/O handling |
Evas Generic Loaders | Extra image loaders for complex image types |
Emotion Generic Players | Extra video decoders (for VLC) |
Elementary | Widgets and high level abstractions |
更多详细信息,可以访问EFL官网,先看一下官方DEMO
1.2 EFL Demo
Rage是一个使用Enlightenment Foundation Libraries(EFL)编写的视频和音频播放器,几乎所有用于视频播放和UI的部件都是由EFL本身或EFL库提供的,如GStreamer,Xine,VLC等。 由于它使用EFL,Rage将在X11,Wayland,甚至是带有Framebuffer控制台(fbcon)或Direct Rendering Manager(DMS)子系统的原始帧缓冲区中工作
Ephoto是使用Enlightenment Foundation Libraries(EFL)编写的图像查看器和编辑器,Ephoto支持:
- 浏览文件系统并以易于使用的网格视图显示图像
- 以单个图像视图格式浏览图像
- 以幻灯片方式查看图像
- 使用剪裁,自动增强,模糊,锐化,亮度/对比度/灰度调整,色调/饱和度/值调整和色彩等级调整等功能编辑图像
- 将艺术滤镜应用于图像,例如黑白和旧照片
- 拖放文件操作可轻松维护您的照片目录
Edi是一个使用Enlightenment Foundation Libraries(EFL)设计和构建的开发环境。 整个项目的目标是为Linux创建一个新的本机开发环境,使之比以往任何时候都更容易上手和运行
EFL库里面还带有大量的DEMO,包括控件的使用,动画特效,GPU渲染等等
1.3 EFL 渲染模式
1.3.1 立即模式
立即模式是图形工具包库中最常用的模式,例如GTK+,GDI和GDI+。 应用程序负责重新绘制无效的客户区部分
应用程序根据需要处理任何绘图问题,并且显示系统绘制一些GUI。 绘图完成后,它将显示在目标中。 此模式允许用户精确控制渲染周期。 但是,如果绘图命令被误用,则可能执行不必要的绘制或根本不绘制
1.3.2 保留模式
采用保留模式的图形系统基本上负责响应渲染应用程序对象的所有重绘请求。 客户端不会直接导致实际渲染,但是当更新部分对象时会重新绘制对象
Evas是EFL中绘图模块,由于Evas使用保留模式,因此无需命令任何绘图。只需要将新图像文件设置为图像对象并移动矩形对象。 Evas计算无效区域,并在渲染时重绘应用程序后面的图像和矩形
EFL和/或基本应用程序在ecore主循环上工作,循环在每个帧上进行几步。 当主循环进入空闲的enterer步骤时,Evas重绘对象中的一些更改。 如果没有更改,则跳过Evas渲染。 否则,Evas会计算所有显示对象的任何更改部分并重绘它们
为了最小化渲染,Evas会跟踪所有显示对象的状态,例如位置,大小,可见性和颜色。 即使其中一些状态已更改但对象被其他模糊对象隐藏,也不会重绘。 换句话说,Evas仅在屏幕中绘制必要的更改
下图说明了Evas如何重绘更改的区域:
- 在第一示例中,存在蓝色背景对象(天蓝色矩形)和部分隐藏的云图像对象。 在它们上方,有一个红色和绿色矩形,绿色矩形上印有“Hello out there”文本
- 在第二个示例中,一些对象已移动(云图像向右移动,绿色矩形向下移动)
- 因此,第三个示例说明了一些需要更新的区域
- Evas决定哪些部分无效并重新绘制。 第四个例子显示了屏幕的清洁部分,即重绘区域。Evas仅在重绘部分重绘内容
- 最后,第五个示例显示了如何更新屏幕并显示结果。
如果Evas以立即模式工作,则应用程序需要自己计算更改的区域,从而增加额外的工作量
2 AWTK
2.1 AWTK简介
AWTK全称Toolkit AnyWhere,是ZLG开发的开源GUI引擎,旨在为嵌入式系统、WEB、各种小程序、手机和PC打造的通用 GUI引擎,为用户提供一个功能强大、高效可靠、简单易用、可轻松做出炫酷效果的GUI引擎
AWTK寓意有两个方面:
- Toolkit AnyWhere
- ZLG物联网操作系统AWorks内置GUI
AWTK源码仓库:
- 主源码仓库:/zlgopen/awtk
- 镜像源码仓库:/zlgopen/awtk
2.2 主要特色
2.2.1 跨平台
AWTK 是跨平台的,这有两个方面的意思:
- AWTK本身是跨平台的。目前支持的平台有ZLG AWorks、Windows、Linux、MacOS、嵌入式Linux和嵌入式裸系统,可以轻松的移植到各种RTOS上。AWTK以后也可以运行在浏览器(即将公测)、各种小程序、Android 和 iOS 等平台上运行
- AWTK 同时还提供了一套跨平台的基础工具库。其中包括链表、数组、字符串 (UTF8和widechar),事件发射器、值、对象、文件系统、互斥锁和线程、表达式和字符串解析等等,让你用 AWTK 开发的应用程序可以真正跨平台运行
2.2.2 高效
AWTK通过一系列的手段保证AWTK应用程序高效运行
- 通过脏矩算法只更新变化的部分
- 支持3 FrameBuffer让界面以最高帧率运行(可选)
- UI描述文件和主题文件使用高效的二进制格式,解析在瞬间完成
- 支持各种GPU加速接口。如OpenGL、DirectX、Vulkan和Metal等
- 支持嵌入式平台的各种2D加速接口。目前STM32的DMA2D和NXP的PXP接口,厂家可以轻松扩展自己的加速接口
2.2.3 稳定
AWTK 通过下列方式极力让代码稳定可靠:
- 使用cppcheck和facebook infer进行静态检查
- 使用valgrind进行动态内存检查
- 近两万行的单元测试代码
- ZLG强大GUI团队的支持
- 经过多个实际项目验证
- 多平台/多编译器验证
- 优秀的架构设计
- Code Review
- 手工测试
2.2.4 强大
- 丰富的控件(持续增加中)
- 支持各种图片格式(png/jpg/gif/svg)
- 支持各种字体格式(点阵和矢量)
- 支持窗口动画
- 支持控件动画
- 支持高清屏
- 支持界面描述文件
- 支持主题描述文件
- 支持控件布局策略
- 支持对话框高亮策略
- 丰富的辅助工具
- 支持从低端的Cortex M3到各种高端CPU
- 支持无文件系统和自定义的文件系统
- 支持裸系统和RTOS
2.2.5 易用
- 大量的示例代码
- 完善的API文档和使用文档
- ZLG强大的技术支持团队
- 用AWTK本身开发的界面编辑器(开发中)
- 声明式的界面描述语言。一行代码启用控件动画,启用窗口动画,显示图片(png/jpg/svg/gif)
2.2.6 高度扩展性
- 可以扩展自己的控件
- 可以扩展自己的动画
- 可以实现自己的主循环
- 可以扩展自己的软键盘
- 可以扩展自己的图片加载器
- 可以扩展自己的字体加载器
- 可以扩展自己的输入法引擎
- 可以扩展自己的控件布局算法
- 可以扩展自己的对话框高亮策略
- 可以实现自己的LCD接口
- 可以扩展自己的矢量引擎(如使用skia/cairo)
- 所有扩展组件和内置组件具有相同的待遇
2.2.7 多种开发语言
AWTK 本身是用C语言开发的,可以通过IDL生成各种脚本语言的绑定。生成的绑定代码不是简单的把C语言的API映射到脚本语言,而是生成脚本语言原生代码风格的API。目前支持以下语言 (以后根据需要增加):
- C
- Lua
- Javascript on jerryscript
- Javascript on nodejs
2.2.8 国际化
- 支持Unicode
- 支持输入法
- 支持字符串翻译(实时生效)
- 支持图片翻译(实时生效)
- 文字双向排版(计划中)
2.2.9 开放源码,免费商用
- 采用LGPL-2.1开源协议
2.3 AWTK Demo
Demo均可在Web端在线体验:
名称 | 在线演示 | 说明 | 源码 |
---|---|---|---|
hello | awtk/demos/hello/ | hello awtk演示 | /zlgopen/awtk-hello |
demoui | awtk/demos/demoui/ | 基本控件演示 | /zlgopen/awtk |
demouijs | awtk/demos/demouijs/ | 基本控件演示(JS) | /zlgopen/awtk |
名称 | 在线演示 | 说明 | 源码 |
---|---|---|---|
HelloWorld-Demo | awtk/demos/HelloWorld-Demo/ | 最简单的入门 Demo,包含基本的文本和按钮控件使用方法 | /zlgopen/awtk-examples |
-Demo | awtk/demos/-Demo/ | 最简单的入门 Demo,演示如何使用 XML 方式设计界面 | /zlgopen/awtk-examples |
CleanAir-Demo | awtk/demos/CleanAir-Demo/ | 新风系统演示 Demo | /zlgopen/awtk-examples |
Meter-Demo | awtk/demos/Meter-Demo/ | 普通工业仪表演示 Demo | /zlgopen/awtk-examples |
Chart-Demo | awtk/demos/Chart-Demo/ | 图表演示 Demo,包含仪表、饼图、曲线图、柱状图 | /zlgopen/awtk-examples |
MusicPlayer-Demo | awtk/demos/MusicPlayer-Demo/ | 音乐播放器演示 Demo | /zlgopen/awtk-examples |
SmartWatch-Demo | awtk/demos/SmartWatch-Demo/ | 智能手表演示 Demo | /zlgopen/awtk-examples |
3 Wayland/Weston
Wayland旨在作为X的简单替代品,更易于开发和维护。GNOME和KDE预计将被移植到它
Wayland是一个合成器与其客户交谈的协议,以及该协议的C库实现。 合成器可以是在Linux内核模式设置和evdev输入设备,X应用程序或Wayland客户端本身上运行的独立显示服务器。客户端可以是传统应用程序,X服务器(无根或全屏)或其他显示服务器
Wayland项目的一部分也是Wayland合成器的Weston参考实现。Weston可以作为X客户端运行,也可以在Linux KMS下运行,并附带一些演示客户端。 Weston合成器是一个简单快速的合成器,适用于许多嵌入式和移动用例
Wayland严格意义上来说,并不能说是GUI,它更像是一个桌面,简单来说它只是提供一个Buffer,来供其他GUI,比如Qt,Gtk,EFL绘制,然后把所有Buffer当做图层,再渲染输出到显示器上,当然能力强悍的人,可以直接调用Wayland透出来的接口,绘制自己想要的窗口
想要了解更多信息,可以访问Wayland官网和国内写的比较好的一篇文章Wayland与Weston简介
4 SDL
4.1 SDL简介
SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,旨在通过OpenGL和Direct3D提供对音频,键盘,鼠标,操纵杆和图形硬件的低级访问,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Windows、Mac OS X等)的应用软件。目前SDL多用于开发游戏、模拟器、媒体播放器等多媒体应用领域,用下面这张图可以很明确地说明SDL的用途
SDL正式支持Windows,Mac OS X,Linux,iOS和Android。可以在源代码中找到对其他平台的支持
SDL是用C语言编写的,与C++本身一起工作,并且有几种其他语言可用的绑定,包括C#和Python
SDL 2.0在zlib许可下分发。此许可证允许您在任何软件中*使用SDL
SDL被广泛的用于许多著名的游戏。最著名的游戏是赢得Linux组游戏开发大奖的 文明:权利的召唤(Civilization: Call To Power)
可以访问SDL官网,和WIKI获取更多资料
4.2 SDL特性
4.2.1 Video
- 3D图形:
- SDL可与OpenGL API或Direct3D API结合使用,用于3D图形
- 加速2D渲染API:
- 支持简单旋转,缩放和alpha混合,所有这些都使用现代3D API加速
- 使用OpenGL和Direct3D支持加速,并且存在软件回退
- 创建和管理多个窗口
4.2.2 Input Events
- 提供的事件和API函数:
- 应用程序和窗口状态更改
- 鼠标输入
- 键盘输入
- 操纵杆和游戏控制器输入
- 多点触控手势
- 可以使用SDL_EventState()启用或禁用每个事件
- 事件在发布到内部事件队列之前通过用户指定的过滤器函数传递
- 线程安全事件队列
4.2.3 Force Feedback
- Windows,Mac OS X和Linux支持强制反馈
4.2.4 Audio
- 设置8位和16位音频,单声道立体声或5.1环绕声的音频播放,如果硬件不支持该格式,则可选择转换
- 音频在单独的线程中独立运行,通过用户回调机制填充
- 专为定制软件音频混音器而设计,但SDL_mixer提供完整的音频/音乐输出库
4.2.5 File I/O Abstraction
- 用于打开,读取和写入数据的通用抽象
- 内置支持文件和内存
4.2.6 Shared Object Support
- 加载共享对象(Windows上的DLL,Mac OS X上的.dylib,Linux上的.so)
- 查找功能在共享对象中
4.2.7 Threads
- 简单的线程创建API
- 简单的线程本地存储API
- 互斥量,信号量和条件变量
- 无锁编程的原子操作
4.2.8 Timers
- 获取经过的毫秒数
- 等待指定的毫秒数
- 在单独的线程中创建与代码一起运行的计时器
- 使用高分辨率计数器进行分析
4.2.9 CPU Feature Detection
- 查询CPU数量
- 检测CPU功能和支持的指令集
4.2.10 Endian Independence
- 检测当前系统的字节顺序
- 用于快速交换数据值的例程
- 读取和写入指定字节序的数据
4.2.11 Power Management
- 查询电源管理状态
4.3 SDL运行平台
4.3.1 Windows
- 使用Win32 API进行显示,利用Direct3D进行硬件加速
- 使用DirectSound和XAudio2获取声音
4.3.2 Mac OS X
- 使用Cocoa进行视频显示,利用OpenGL进行硬件加速
- 使用Core Audio获取声音
4.3.3 Linux
- 使用X11进行视频显示,利用OpenGL进行硬件加速
- 使用ALSA,OSS和PulseAudio API获取声
4.3.4 iOS
- 使用UIKit进行视频显示,利用OpenGL ES 2.0进行硬件加速
- 使用Core Audio获取声音
4.3.5 Android
- 使用JNI接口进行视频显示,利用OpenGL ES 1.1和2.0进行硬件加速
- 使用JNI音频回调声音
4.4 SDL开发的游戏
5 DirectFB
5.1 DirectFB简介
DirectFB是一个轻量级的提供硬件图形加速,输入设备处理特性和抽象的图形库,它集成了支持半透明的视窗系统以及在LinuxFramebuffer驱动之上的多层显示。它是一个用软件封装当前硬件无法支持的图形算法来完成硬件加速的层。DirectFB是为嵌入式系统而设计。它是以最小的资源开销来实现最高的硬件加速性能
简而言之,DirectFB(直接帧缓冲区)是在Linux帧缓冲区(fbdev)抽象层之上实现的一组图形API,DirectFB处于QT,GTK+这样的高级GUI框架的下面,Linux系统驱动的上面。如下图
DirectFB运行在帧缓冲设备(/dev/fb)之上,并利用其芯片组驱动程序实现硬件加速
- 也可以在VESA帧缓冲区上运行
DirectFB只通过/dev/fb执行以下任务?
- 设置视频模式(分辨率,颜色深度和时序)
- 帧缓冲区和I/O端口的内存映射
- 更改视口(例如,用于双缓冲区)
DirectFB使用自己的芯片组驱动程序通过内存映射的I/O端口利用硬件加速
- 关闭帧缓冲驱动程序加速功能
想了解更多信息,可以访问DirectFB
5.2 DirectFB特性
5.2.1 目标
- 小内存占用空间
- 最大化硬件加速的实用程序
- 支持高级图形操作,例如多种alpha混合模式
- 没有内核修改
- 没有库依赖项,libc除外
- 符合MHP规范的要求
5.2.2 绘图
- 矩形填充/绘图
- 三角形填充/绘图
- 画线
- Blit
- Alpha混合(纹理alpha,alpha调制)
- Porter/Duff
- 着色
- Source Color Keying
- Destination Color Keying
- 集成窗口系统
- OpenGL API的一个子集(Mesa)
5.2.3 事件
- 标准键盘
- 串行和PS/2鼠标
- 操纵杆
- Linux输入层设备
- 红外遥控器(lirc)
- iPAQ触摸屏
- ucb 1x00触摸屏
- Microtech触摸屏
- 索尼PI Jogdial
5.2.4 多媒体
图片格式支持
- JPEG (libjpeg)
- PNG (libpng2)
- GIF
- Image format supported by Imlib2
视频格式支持
- mpeg1/2 (libmpeg3)
- AVI (avifile)
- MOV (
OpenQuicktime
) - Macromedia Flash (libflash)
- video4linux
字体格式支持
- DirectFB bitmap font
-
TrueType
(FreeType2
)
5.3 DirectFB Demo
directfb-exmaple中有一些测试Demo,比如df_andi,df_dok
6 LittlevGL
6.1 LittlevGL简介
LittlevGL是一个免费的开源图形库,提供了创建嵌入式GUI所需的一切,具有易于使用的图形元素,美观的视觉效果和低内存占用,采用MIT许可协议,可以访问LittlevGL获取更多资料
- LittlevGL源码仓库:/littlevgl/lvgl
6.2 LittlevGL特性
- 强大的构建块按钮,图表,列表,滑块,图像等
- 具有动画,抗锯齿,不透明度,平滑滚动的高级图形
- 同时使用各种输入设备触摸屏,鼠标,键盘,编码器,按钮等
- 同时使用多个显示器,即单色和彩色显示器
- 使用UTF-8编码的多语言支持
- 完全可定制的图形元素
- 硬件独立于任何微控制器或显示器
- 可扩展至小内存(64 kB闪存,10 kB RAM)
- 支持OS,外部存储器和GPU,但不是必需的
- 单帧缓冲操作即使具有高级图形效果
- 用C语言编写,以获得最大的兼容性
- Micropython Binding 在Micropython中公开LittlevGL API
- 模拟器在没有嵌入式硬件的PC上开发
- 快速开发的教程,示例和主题
- 文档和API参考
支持的设备:基本上,每个现代控制器 - 能够驱动显示器 - 都适合运行LittlevGL。最低要求如下
- 16,32或64位微控制器或处理器
- 大于建议使用16 MHz时钟速度
- 闪存/ ROM:> 64 kB用于非常重要的组件(建议> 180 kB)
- 内存:
- 静态RAM使用:~8…16 kB取决于使用的功能和对象类型
- 堆栈:> 2kB(建议> 4 kB)
- 动态数据(堆):> 4 KB(如果使用多个对象,建议使用> 16 kB)。LV_MEM_SIZE在lv_conf.h中设置。
- 显示缓冲区:> “水平分辨率”像素(建议> 10× “水平分辨率”)
- C99或更新的编译器
6.3 LittlevGL Demo
7 Nuklear
7.1 Nuklear简介
Nuklear是一个使用ANSI C编写并在开源社区许可的小型立即模式的图形用户接口工具包。它被设计成为简单可嵌入式用户应用界面,也没有任何的依赖关系,默认渲染后端或者操作系统窗口和输入处理,而是通过使用简单的输入状态去输入和绘制命令描述原始形状,提供一个非常模块化的库方法输出。所以不是尝试在多个平台上进行抽象并提供呈现的封层库,而是仅仅关注实际的UI,采用MIT许可协议
- 项目地址:/vurtun/nuklear
7.2 Nuklear特性
- 立即模式的用户图形界面工具包
- 一个单独的头文件库
- 使用C89编写(ANSI C)
- 小代码库(~18kLOC)
- 专注于便携型,效率和简单性
- 没有依赖关系(如果不想的话,甚至不是标准库)
- 完全可换肤,可定制
- 占用内存小,可根据需要或期望来进行总的内存控制
- 支持UTF-8
- 没有全局或隐藏状态
- 可定制的库模块(你可以只编译和使用你需要的)
- 可选的字体和顶点缓存输出
- 官方文档