GUI 引擎评价指标

GUI 引擎评价指标

github 上的开源 GUI 引擎至少有数十个,如何去评估它们的优劣,如何选择你需要的 GUI 引擎?这个是艰巨的任务,每个人的需求不一样,GUI 开发者的意图也不同,很难找到统一的标准去选出最好的 GUI。QT 是最强大的,没有之一,但也不一定适合你。

不管怎么样,总有些指标可以提供有价值的参考,尽管这些指标在遇到不同使用的场景,不同的公司背景,不同的个人喜好,它们所占的权重也大不相同。但是并不能抹杀这些指标的价值,关键在于如何根据自己的需要调整它们的比重。

《这个开源的 6 千行 UI 框架,能打败 QT,MFC 吗?》 这篇文章里,诸葛不亮 的 37 问给了我极大的启发,在开发 AWTK 的过程中,多次重读这篇文章,这篇文章堪称是 GUI 引擎开发者的指路明灯。

如果诸葛大侠不介意,为了活跃气氛,我就把本文提到的指标称为《诸葛不亮-李先静 GUI 引擎评价指标》,把诸葛大侠放在前面,是表示对他的感谢,把我的名字放在里面,是由我承担一些人的指责。

先开个头,算是抛砖引玉吧。后续会不断完善,希望大家也把自己选择 GUI 引擎时的指标补充进来。

1. 基本指标

1.1 开发者的心态

当你用他们的 GUI 时,他们是感谢你的支持,还在觉得你欠他们的呢?如果他们没有心存感谢,你最好别用。否则,遇到问题时,你怎么能指望他们帮你解决呢?

1.2 帮助文档

是否有《API 手册》、《使用手册》、《常见问题》、《移植文档》和《HowTo》,文档是否在定期更新?

1.3 示例代码

是否有简单的入门示例、各种控件的的用法、完整功能的示例?

1.4 代码风格

目录名、文件名、类名、函数名、函数参数、局部变量名、全局变量名、注释和缩进是否一致。

1.5 编程语言

对于 GUI 引擎来说,支持多种编程语言是重要的,可以满足不同的开发者的需要。对于使用者来说,GUI 是否提供了你需要的编程语言才是最重要的。

1.6 支持的平台

对于 GUI 引擎来说,支持多种平台是重要的,可以满足不同的开发者的需要。对于使用者来说,支持多种平台也是重要的,你现在开发嵌入式系统,过段时间你可能要开发一个 APP 控制你设备,没有必要浪费时间去学习不同的 GUI。

GUI 是否支持目标平台的界面风格,是否提供跨平台的运行库,是否对平台基本的原生功能进行了包装,能否扩展新的功能。

1.7 可视化的界面设计工具

所见即所得方式开发界面可以降低学习门槛,提高开发效率。

1.8 可视化的界面设计工具是否是用该 GUI 本身开发的

用该 GUI 本身开发的界面设计工具,可以验证该 GUI 本身的功能是否强大和稳定。

另外用该 GUI 本身开发的界面设计工具,才能把界面设计工具做得易用。比如 TabControl 控件,在设计时可以切换页面,只有用该 GUI 本身开发的界面设计工具才容易实现。

1.9 在开发环境模拟运行

运行环境和开发环境往往不同, 如果每次都要部署一下才能看到效果,那开发速度一定上不来。

1.10 用 XML/JSON 等数据来描述界面

XML/JSON 是声明式的语法,不但手工编写比写程序容易,也方便借助工具的支持。

对于嵌入低端嵌入式系统来说,XML/JSON 效率不高,最好的办法是运行时转换成高效的二进制格式。就像代码一样,编译之前的代码给人看,编译之后的代码给机器看。

1.11 用 XML/CSS 等数据来描述界面的风格

XML/JSON 是声明式的语法,不但手工编写比写程序容易,也方便借助工具的支持。

把界面风格从 UI 描述文件和代码中剥离出来,也有利于后期的维护,毕竟界面效果是最容易变化的。

对于嵌入低端嵌入式系统来说,XML/JSON 效率不高,最好的办法是运行时转换成高效的二进制格式。就像代码一样,编译之前的代码给人看,编译之后的代码给机器看。

1.12 字体格式

支持点阵字体吗?支持矢量字体吗?支持自定义字体格式吗?支持只加载部分字体到内存吗?配套工具完善吗?

1.13 图片格式

支持常见的 png/jpg/gif/bmp 格式吗?支持 SVG 等矢量图形吗?能扩展支持新的格式吗?

1.14 输入法

支持拼音输入法吗?支持软键盘的 T9 输入法吗?支持硬键盘的 T9 输入法吗?支持语音输入法吗?支持手写输入法吗?可以扩展支持新的输入吗?

1.15 基本架构模式

是否内置提供支持 MVC、MVP 和 MVVM 等架构模式?是否支持 Vue、React 和小程序类似的开发方式?

2. 功能指标

2.1 高清屏

是否支持高清屏?在 PC 上运行时界面变糊了,在手机上运行时字体变小了,都是不支持高清屏的特征。不支持高清屏就不用谈什么跨平台了。

2.2 矢量图 API

矢量图 API 是非常重要的,强大矢量图 API 能实现很多神奇的效果。个人觉得 HTML5 Canvas 2D API 是最好的矢量图 API。用 cairo、skia、agge 和 nanovg 这些开源的库很容易实现类似的 API。

GUI 一定要提供一个抽象的接口,在不同的情况下,可以无缝的切换到最优的实现方案上。比如在嵌入式平台用 agge,在嵌入式 linux 平台用 cairo,在 PC 上用 skia 或 nanovg。

2.3 窗口动画

是否支持窗口动画?窗口动画的种类是否够用?是否可以扩展自己的窗口动画。窗口动画的效率如何?窗口动画使用是否方便?

2.4 控件动画

是否支持控件动画?支持那些控件动画?是否支持自定义的控件动画?控件动画使用是否方便?控件动画的参数有哪些?是否可以停止、暂停和播放控件动画。

2.5 内置控件是否丰富

是否有你目前需要的控件和将来可能用到的控件。

2.6 控件组合是否方便

有的 GUI 把控件分成叶子节点控件和容器控件,label、image、edit 和 button 都是叶子节点控件。这样做灵活性很差,往 button 放个图片或者动画,往 label 里放个图片,往 edit 里放一个"清除"/"查找"的 button,不是方便的事吗,为什么要限制呢?

2.7 自定义控件

没有一个 GUI 能够满足所有的需求,如果不支持自定义控件就悲催了。这样一个简单的需要,在有的 GUI 里却需要修改 GUI 引擎的代码,那就不好玩了。

2.8 布局 (layout) 参数

通过布局参数控制控件布局,可以让应用程序适用于不同大小的屏幕。是否支持布局参数,布局功能是否强大,是否可以扩展自定义布局?

2.9 控件自定义属性

如果控件支持自定义属性,用户可以存放自己的数据到控件中,可以避免使用全局变量,是个极为方便的特性。

如果控件支持自定义属性,对 GUI 进行扩展也很方便,比如 AWTK-MVVM 的绑定规则就使用了用户自定义属性,如果将 AWTK-MVVM 移植到 Qt 就很容易,因为 Qt 也支持自定义属性,要移植到 emwin 就麻烦不少。

2.10 控件:label

label 是最简单的控件,要做好也不容易。就像炒饭是厨师的基本功一下,label 就是 GUI 开发者的基本功。 支持 style(字体、颜色和对齐等各种参数)吗?支持 unicode 的换行规则吗?支持滚动显示吗?支持省略号显示吗?支持 bidi 算法吗?支持动画(比如打字效果和拨号中那种)。滚动显示支持得到焦点时才滚动吗?

当然把 label 和 scroll_label 分成两个控件好点,实现简单而且在低端平台无需支持一下不必要的特性。总之,用户需要时就要有这些功能。

2.11 控件:image

支持旋转和缩放吗? 支持旋转和缩放动画吗?支持居中、平铺、x 平铺、y 平铺、九宫格、三宫格、缩放和按比例缩放等各种绘制效果吗?支持显示文本吗?支持点击吗?支持勾选吗?

2.12 控件:edit

支持 edit 不难,要做好却不容易:支持拷贝、剪切和粘贴吗?支持撤销和重做吗?支持通过键盘和鼠标选择吗?支持输入法吗?可以根据各种输入类型自动选择软键盘吗?可以自定义软键盘吗?可以指定获得焦点时软件盘是否自动开启吗?可以指定获失去焦点时软件盘是否自动关闭吗?支持设置有效性检查函数吗?支持失去焦点时自动修复输入值吗?支持失去焦点时提示输入有误吗?支持输入提示吗?支持输入有变化时提示吗?支持时间、日期和 IP 地址等格式输入吗?

2.13 控件:button

是否支持长按?是否支持设置长按时间?是否支持重复触发?是否支持图标?是否支持子控件(如图片和动画)?

2.14 控件:软键盘

软键盘使用 XML/JSON 描述吗?可以定制软键盘(键盘布局和风格)吗?定制软键盘需要修改代码吗?软键盘可以用纯方向键切换焦点吗?

2.15 控件:table view

支持放入进度条、选择框、按钮、图片和编辑器吗?支持 View 和 Model 分离吗?能支持千万级别的数据吗?

2.16 控件:code editor

有些高手常用两个指标来衡量 GUI 的功能:1. 能用它开发一个记事本吗? 2. 能用它开发一个界面设计器吗?如果支持 code editor,就可以用它实现一个功能更强大的记事本。

2.17 style

是否支持设置圆角半径?是否支持对部分角设置圆角?是否可以分别设置上下左右的边框?是否支持自定义的状态?

2.18 对话框高亮

弹出对话框时:是否支持对话框变暗?是否支持对话框动态变暗?是否支持对话框动态变模糊?是否支持新的高亮策略。

2.19 键盘切换焦点

是否支持键盘切换焦点?是否支持上下左右切换焦点(有的设备只有方向键和确认键)?是否支持设置切换焦点的键值?

2.20 截屏

是否支持截屏?

2.21 操作反馈

是否支持按键音?不同的控件支付支持不同的按键音?是否支持触屏震动?

2.22 Accessibility

是否支持字体整体放大?是否支持读屏软件?

2.23 存储接口

有没有提供跨平台的存储接口,如文件系统、配置信息和数据库。

2.24 资源管理

有没有统一的资源管理接口?资源管理也是很麻烦的事情:比如图片,它可能存放在 flash 中,可能存放在文件系统中,也可能放在服务器上;对于普通屏和高清屏需要加载不同的文件;不同的语言也可能需要加载不同的文件;同一个软件在不同的系统上运行,可能要加载不同的格式,有的系统只能使用位图,有的系统可以使用 png/jpg;图片还需缓存,缓存还需要清理。所有这些东西,如果让应用程序来处理,那将是一场噩梦!

强大的资源管理器,可以屏蔽所有这些细节,让应用程序无需感知。比如,你需要"earth"这个图片,你无需关心它的位置和格式,无需关心屏幕密度和语言的影响,系统自动加载最佳的图片文件。

3. 性能

3.1 高效的算法

是否支持脏矩形算法、3 framebuffer 和 二进制格式。开发时使用 XML 方便程序员修改,运行时使用高效二进制格式提高运行效率。

3.2 2D 硬件加速

是否支持常见的加速接口,如 STM32 的 DMA2D 和 NXP 的 PXP。厂家是否可以扩展自己的加速接口。

3.3 3D 硬件加速

是否支持 OpenGL、DirectX、Vulkan 和 Metal 等。

3.4 低端平台

最低能支持什么样的硬件平台?功能强大体积通常比较大,这对 GUI 的可配置性是一个极大的考验。

3.5 启动时间

1 秒启动?5 秒启动?还要等半分钟?

4. 国际化

4.1 Unicode。

是否支持 UTF-8 和 UTF-16 编码?

4.2 多国语言输入法。

是否支持 T9 输入法?是否可以支持新的输入法?

4.3 字符串翻译。

是否支持字符串翻译?是否支持实时切换语言(不需重启)?

4.4 图片翻译。

是否支持图片翻译(既切换语言时,自动切换某些图片)?

4.5 文字双向排版。

是否支持阿拉伯文字的双向排版?

4.6 编码转换函数。

是否提供的跨平台的编码转换函数?

5 软件质量

5.1 单元测试

是否有完整的单元测试?单元测试是否全部通过?

5.2 内存耗尽处理流程

内存耗尽时是直接崩溃?还是让应用程序能优雅的退出?

5.3 内存泄露检查机制

是否有内存泄露检查机制?是否能用 valgrind 进行内存泄露和溢出检查?

5.4 代码静态检查。

是否通过了 cppcheckinfer 或其它静态检查工具的检查?

5.5 事件录制和重放功能

是否可以录制用户操作的事件,并通过重放进行压力测试?

5.6 Appuim 进行自动测试

是否支持 Appuim,通过 javascript 等脚本自动化集成测试?

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 图像融合评价指标是用来评估融合图像质量的方法,常用的评价指标有结构相似性(SSIM)、峰值信噪比(PSNR)、空间频谱特征相似度(SFFS)等。 其中,结构相似性指数(SSIM)是衡量两幅图像相似度的常用指标之一,其计算公式为: SSIM(x, y) = (2μxμy + c1)(2σxy + c2) / (μx² + μy² + c1)(σx² + σy² + c2) 其中,x和y分别表示待评价的融合图像和原始图像,μ和σ分别表示图像均值和标准差,σxy表示协方差,c1和c2是常量,用来避免被0分母除。 峰值信噪比(PSNR)是另一种常用的评价指标,其计算公式为: PSNR(x, y) = 10 * log10(MAX² / MSE) 其中,x和y同样表示待评价的图像,MAX表示像素值的最大范围(一般为255),MSE表示均方误差。 空间频谱特征相似度(SFFS)是一种基于频域的评价指标,其计算过程包括将图像转换到频域,计算频率响应差异,以及对差异进行加权等。 为了实现图像融合评价指标的计算,可以使用Python编程语言编写GUI代码。其中,GUI界面可以包括上传待评价和原始图像的按钮,计算评价指标的按钮,以及显示评价结果的区域。在计算评价指标的功能函数中,可以根据公式来进行计算,并将结果显示在GUI界面的评价结果区域中。 需要注意的是,图像融合评价指标的计算需要依赖一些图像处理库,如OpenCV和NumPy等,可以通过安装相应的库来实现所需的功能。 以上是关于图像融合评价指标GUI代码的简要介绍,具体实现还需要根据具体需求进行编写。 ### 回答2: 图像融合评价指标是用来衡量图像融合结果质量的方法。常见的评价指标有结构相似度(SSIM)、峰值信噪比(PSNR)等。 下面是一个用Python编写的图像融合评价指标GUI代码示例: ```python import tkinter as tk from tkinter import filedialog import cv2 import numpy as np from skimage.metrics import structural_similarity as compare_ssim def load_image(): filename = filedialog.askopenfilename(initialdir="/", title="Select an Image", filetypes=(("Image files", "*.jpg *.jpeg *.png"), ("All files", "*.*"))) image = cv2.imread(filename) cv2.imshow("Image", image) return image def calculate_metrics(): img1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY) img2 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY) ssim = compare_ssim(img1, img2) psnr = cv2.PSNR(img1, img2) ssim_label.config(text="SSIM: {:.4f}".format(ssim)) psnr_label.config(text="PSNR: {:.4f}".format(psnr)) root = tk.Tk() root.title("图像融合评价指标计算器") button1 = tk.Button(root, text="选择图像1", command=lambda: load_image()) button1.pack() button2 = tk.Button(root, text="选择图像2", command=lambda: load_image()) button2.pack() calculate_button = tk.Button(root, text="计算评价指标", command=lambda: calculate_metrics()) calculate_button.pack() ssim_label = tk.Label(root, text="SSIM: ") ssim_label.pack() psnr_label = tk.Label(root, text="PSNR: ") psnr_label.pack() root.mainloop() ``` 这个代码实现了一个简单的图像融合评价指标计算器的GUI界面。用户可以通过点击按钮选择两个图像文件,然后点击计算评价指标按钮,程序会对两个图像进行评估,计算出SSIM和PSNR,并在界面上显示出来。 ### 回答3: 图像融合评价指标是用来评价图像融合算法效果的一种指标。常用的图像融合评价指标有:均方误差(MSE)、峰值信噪比(PSNR)、结构相似性(SSIM)等。 下面是一个简单的图像融合评价指标GUI代码示例: ```python import cv2 from tkinter import * from tkinter import filedialog import numpy as np from skimage import metrics def open_image(): filename = filedialog.askopenfilename(initialdir="/", title="Select file", filetypes=(("jpeg files", "*.jpg"), ("all files", "*.*"))) image = cv2.imread(filename) return image def calculate_metrics(image1, image2): mse = np.mean((image1 - image2)**2) psnr = metrics.peak_signal_noise_ratio(image1, image2) ssim = metrics.structural_similarity(image1, image2, multichannel=True) return mse, psnr, ssim def display_metrics(): image1 = open_image() image2 = open_image() mse, psnr, ssim = calculate_metrics(image1, image2) print("MSE:", mse) print("PSNR:", psnr) print("SSIM:", ssim) # 在GUI界面中显示评价指标 mse_label.config(text="MSE: " + str(mse)) psnr_label.config(text="PSNR: " + str(psnr)) ssim_label.config(text="SSIM: " + str(ssim)) # 创建GUI界面 root = Tk() root.title("图像融合评价指标") root.geometry("400x200") # 创建按钮和标签 open_button1 = Button(root, text="打开图像1", command=open_image) open_button1.pack() open_button2 = Button(root, text="打开图像2", command=open_image) open_button2.pack() metrics_button = Button(root, text="计算评价指标", command=display_metrics) metrics_button.pack() mse_label = Label(root, text="") mse_label.pack() psnr_label = Label(root, text="") psnr_label.pack() ssim_label = Label(root, text="") ssim_label.pack() root.mainloop() ``` 这段代码中,我们使用了OpenCV库和scikit-image库来处理图像和计算评价指标。通过GUI界面,可以选择两个图像,并计算评价指标,并将结果显示在界面上。当用户点击打开图像按钮时,会调用open_image函数打开图像文件,并返回图像的矩阵。然后,通过calculate_metrics函数计算图像融合评价指标,并将结果打印出来。最后,使用Tkinter库创建GUI界面,包括打开图像按钮、计算评价指标按钮和显示评价指标的标签。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值