GuiLite 3.3 发布:要灵活扩展,还要简单粗暴

来源: 投稿
作者: idea4good
2020-05-26

本次更新,解决了:定制多样化问题,并优化了软件启动速度。

定制需求:

随着开发群的日益壮大,有想法的开发者层出不穷;倒是群主太过正常,显得跟大家有点格格不入了。大家需求是这样的:

  1. 我的硬件,没有framebuffer(这种情况在内存较小的单片机平台很常见),但我也想用GuiLite画出漂亮流畅的效果
  2. 我需要一个可以滚动的UI效果,界面上的所有元素(窗口)可以一起上下左右滑动(例如:手机通信录)
  3. 我需要一个半透明的窗口,其中窗口的背景是半透明的,文字则是不透明的
  4. 我的硬件有2D加速功能,需要GuiLite给与支持

 软件方案:

以上任何一个要求都足以推倒原有框架,因为太过底层,一旦修改就是对基础关键部分的手术。如何用最少的代码简单粗暴的解决问题,不伤执行效率,又不伤结构,是对软件架构的一个重大考验。我们的方案如下:

  1. 对于有经验的开发者来说,这已经是旧闻了,不仅被解决了,而且已经广泛应用在单片机方案中了;为什么旧事重提,就是因为它与需求2、3、4有很大的相似性,有必要一起做个总结:从c_surface派生一个类c_surface_no_fb,主要的绘制(渲染)接口没有变,只是重新实现draw_pixel, fill_rect(重载虚函数),让其通过条用外部的画点驱动函数,进行具体画点工作,具体见display.cpp::c_surface_no_fb
  2. 从c_surface派生一个类c_surface_scroll,扩大surface的高度,宽度,使其能够绘制所有的窗口元素;混动显示的过程,就是设置x,y坐标偏移量的过程,具体见:HelloScroll/UICode/scroll.h 
  3. 从c_surface派生一个类c_surface_transparent,主要的绘制(渲染)接口没有变,但实现绘制过程中,分析颜色的alpha值,从而达到透明效果(重载虚函数),具体见:HelloTransparent/UICode/surface_transparent.h
  4. 从c_surface派生一个类c_surface_2d_acc,重新实现一下draw_pixel,fill_rect接口,在该接口里面使能硬件2D加速功能

优化需求:

  1. Linux版本的实例,看到界面的时间较慢,需要优化
  2. STM32版本,由于有调用malloc的地方,所以,在heap size不够的时候会死机,需要手动设置heap size;该操作有些麻烦,影响移植体验,建议优化

优化方案:

  1. 去掉一些不必要的同步操作,改为异步执行,保证界面第一时间呈现出来
  2. 对实例代码进行几行代码调整,用静态变量代替动态分配

开发者优秀作品展示:

 

(硬件配置:ESP32 + ST7789 + SPI屏幕),由于GIF的原因,画面不能像真实视频那么流畅,更好的效果,可以参看qq群文件。

感谢GuiLite开发群“李子木”同学的分享!虽然这个作品中能看到GuiLite实例的影子,但视觉效果和艺术设计上面,已经完全是暴捶原作的水准了。特别是对SPI屏幕的DMA优化,让画面超出想象的流畅,绝对是SPI屏幕的优化典范。

最后,希望能看到更多优秀的作品,我们会尽力为大家提供一些技术建议,为您的超神之路贡献绵薄之力。

展开阅读全文
8 收藏
分享
加载中
精彩评论
这个是机器人
2020-05-26 12:43
2
举报
不错
2020-05-26 13:32
1
举报
最新评论 (6)
不错
2020-05-26 13:32
1
回复
举报
建议加功能的同时考虑一下小巧,功能太复杂,使用比较麻烦;如果占用资源过大,那普通MCU也就只能跑GUI了。
2020-05-26 10:36
0
回复
举报
是的,Lite是GuiLite的存在之本,一直把代码控制在5千行以下。
2020-05-26 12:21
0
回复
举报
您好,请问这个用有到open-gl的吗?是自己实现底层绘图吗?
2020-05-26 09:38
0
回复
举报
没有用到open-gl,单片机往往只有几十K的存储空间,没法放下open-gl。所有的底层绘制都是内部集成的
2020-05-26 10:06
0
回复
举报
这个是机器人
2020-05-26 12:43
2
回复
举报
更多评论
6 评论
8 收藏
分享
返回顶部
顶部