资源生成概述

对于嵌入式GUI项目而言,除了完成对控件的管理外,还需要对GUI所需的资源进行管理。对于一般的项目而言,主要的资源就是文字和图片资源。

一般来讲,GUI项目的管理代码基本不大,主要的占用Code Size的是图片和文字资源,如何合理管理这些资源对于整个GUI项目至关重要。

存储管理

芯片内部的Code Size资源极其有限,一张320*240RGB565无透明通道的图片就需要153,600Bytes的资源,几张图片就可以把整个芯片占完。

那么简单点,把所有的资源文件放到外部存储中,不就行了。但是需要注意的是,一般来讲GUI都是比较在乎性能的,如果都放到外部存储中,那显示的时候就需要不断地从外部存储中将数据取出来,性能会大幅度下降。

所以对资源的管理既要考虑性能还需考虑存储位置,根据具体项目需要,将高频繁的资源放在内部,不频繁更新的资源放在外部。

本项目对资源的管理既支持内部管理,也支持外部管理

资源管理

通常在嵌入式项目中,资源如图片和字体并不是直接将jpg或者ttf存在芯片中,这样对芯片的资源要求太高了。通常都需要将各个文件翻译成单片机所能识别的字节数组和配置信息等。

而一个项目的资源文件会比较多而杂,如果手动用脚本对文件进行处理,会遇到几个问题。

  1. 图片资源更新,当一个图片不满足要求时,需要更新文件时,又要手动用脚本对文件处理一遍。

  2. 字体资源更新,当一些文本需要更换字体时,并且不同字体有不同文本时,需要管理一堆的txt和font size信息。

  3. 外部资源管理,多个图片、文本资源需要保存外部资源时,如何管理这些资源的存储位置也很重要。

  4. 统计资源信息,需要全局预览项目所使用的资源信息,不可能一个个手工统计。

有一些GUI项目是通过IDE来做的,但是本项目人力有限,不可能做一个IDE出来。所以本项目提供了一套基于json配置文件的资源管理方案,只需要将资源在json文件中配置好,通过脚本就会自动生成嵌入式项目所需的资源文件,对于外部资源,会将所有外部资源打包成一个二进制bin文件,并生成资源所在的偏移地址。

输入包括:

  1. JSON文件,也就是app_resource_config.json,按照格式要求,配置各个资源文件的输出格式。

  2. 图片资源文件,目前支持*.png/*.jpg/*.bmp格式的图片资源,需要将原始文件放入项目中。

  3. 字体资源文件,需要一个txt存放所需的文本信息,一个ttf字体文件。

经过app_resource_generate.py解析脚本后,会输出一系列项目所需文件。输出包括:

  1. 资源索引文件,app_egui_resource_generate.h主要存放一些资源的结构体声明(方便应用引用资源,避免到处引用结构体),外部资源偏移地址的Index信息。

  2. 外部资源偏移文件,app_egui_resource_generate.c主要存放一个egui_ext_res_id_map表,存所有外部资源的偏移地址信息。

  3. 外部资源二进制文件,app_egui_resource_merge.bin将所有的资源文件打包成一个二进制bin文件,可以直接烧录到外部flash中。

  4. 资源统计报告,app_egui_resource_generate_report.md,Markdown格式,直接看到所有资源的code size占用情况。

  5. 各个资源的配置文件(编译),这些主要是编译所需的结构体。内部资源会将资源以数组保存;外部资源会保存资源的配置信息。

image-20241227214036468

总体结构

项目提供了HelloResourceManager示例工程演示如何使用资源管理功能。

image-20241227215322163

使用说明

直接make resource_refresh强制更新,建议当资源有更新都调用这个。

会检查app_egui_resource_merge.bin是否存在,不存在才会更新资源文件。

image-20241227215515539

app_resource_config.json配置说明

为了加注释,使用json5文件格式。包含imgfont两个数组。

图片资源配置

配置在img数组里,每个资源文件需要一个,使用说明详见注释。没配置的参数使用默认值。

external,配置是外部资源还是内部资源。

注意,参数中all主要是满足测试需要,实际项目中建议配置为所需值,不然会导致生成各种配置的资源,但是这些资源并没有使用。

image-20241227215727106

文字资源配置

配置在font数组里,每个资源文件需要一个,使用说明详见注释。没配置的参数使用默认值。

external,配置是外部资源还是内部资源。

file,为ttf字体文件。

text,为需要用ttf生成的文本,一般嵌入式项目只讲需要的字体解析出来就行。

注意,参数中all主要是满足测试需要,实际项目中建议配置为所需值,不然会导致生成各种配置的资源,但是这些资源并没有使用。

image-20241227220153617

注意,考虑到项目中管理方便,相同的字体文件可以支持合并,如下2个配置项目,因为参数都相同,最终会将supported_text_test_0.txtsupported_text_test_1.txt合并,重复的文字会删除。

image-20241227220644128

资源统计

可以直观的看到各个资源所占用的code size大小。

image-20241227220828555

image-20241227220844199

image-20241227220909631