TouchGFX之缓存位图

news/2024/11/20 0:23:35/

位图缓存是专用RAM缓冲区,应用可将位图保存(或缓存)在其中。 如果缓存了位图,在绘制位图时,TouchGFX将自动使用RAM缓存作为像素来源。位图缓存在许多情况下十分有用。 从RAM读取数据通常比从闪存读取要快(特别是在使用纹理映射器时,原因是它使用非线性存储器存取),因此,缓存到RAM可提升UI性能。

位图缓存在许多情况下十分有用。 出于性能方面的考虑,TouchGFX要求存储在外部闪存中的所有图形数据都能直接访问(通过指针),无需通过驱动层。 这意味着TouchGFX不能从非存储器映射闪存(如SD卡)直接渲染。 为了打破这一限制,位图缓存提供了一种在上电期间缓存RAM中的一些或全部位图数据的机制。 因此,当您需要将位图保存在慢速外部存储器(如U盘或SD卡)上时,位图缓存将十分有用。


 

配置屏幕显示图片

 没添加缓存位图之前,在线调试程序不会进入blockCopy函数

程序通过直接访问存储器映射闪存显示图片

位图缓存配置

如需缓存所有位图,则缓存大小必须足够大,才能包含所有位图数据。 注意:会有少量存储空间用于记账(8个字节 x 应用中的位图数量),因此必须分配比原始像素数据的实际需求稍大的存储空间。 该值取决于应用中的位图数量,但额外多几千字节通常即已足够。

TouchGFXHAL.cppLOCATION_PRAGMA_NOLOAD("TouchGFX_Cache")
uint16_t Cache[1024 * 604] LOCATION_ATTRIBUTE_NOLOAD("TouchGFX_Cache");void TouchGFXHAL::initialize()
{// Calling parent implementation of initialize().//// To overwrite the generated implementation, omit call to parent function// and implemented needed functionality here.// Please note, HAL::initialize() must be called to initialize the framework.TouchGFXGeneratedHAL::initialize();Bitmap::setCache(Cache, sizeof(Cache));Bitmap::cacheAll();HAL_GPIO_WritePin(LCD_BL_GPIO_Port, LCD_BL_Pin, GPIO_PIN_SET);
}
TouchGFX.sct; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************LR_IROM1 0x08000000 0x00200000  {    ; load region size_regionER_IROM1 0x08000000 0x00200000  {  ; load address = execution address*.o (RESET, +First)*(InRoot$$Sections).ANY (+RO).ANY (+XO)}RW_IRAM1 0x20000000 0x00020000  {  ; RW data.ANY (+RW +ZI)}RW_IRAM2 0x24000000 0x00080000  {*(.RAM_D1)}RW_IRAM3 0x30000000 0x00048000  {*(.RAM_D2)}RW_IRAM4 0x38000000 0x00010000  {*(.RAM_D3)}RW_IRAM5 0xC0000000 UNINIT 0x02000000  {*(.RAM_SDRAM)*.o (TouchGFX_Framebuffer)*.o (TouchGFX_Cache)}
}LR_ROM1 0x90000000 0x02000000  {ER_ROM1 0x90000000 0x02000000  {  ; load address = execution address*.o (ExtFlashSection)
;	*.o (TextFlashSection)
;	*.o (FontFlashSection)}
}

关闭外部闪存存储器映射

修改blockCopy函数

TouchGFXHAL.cppbool TouchGFXHAL::blockCopy(void* RESTRICT dest, const void* RESTRICT src, uint32_t numBytes)
{
//    return TouchGFXGeneratedHAL::blockCopy(dest, src, numBytes);for(uint32_t i = 0; i < numBytes / 2; i++)*((uint16_t *)dest + i) = 0xFFFF;return true;
}

屏幕显示blockCopy中装载的全像素白色

假设blockCopy如果从存储器非映射闪存缓存图片,则效果相同。

缓存策略

如果可分配用于位图缓存的RAM空间小于位图的总大小,则启动过程中不能缓存所有位图。 举个例子,您可以选择只缓存第一个屏幕需要的位图。 在屏幕之间切换时,您可以删除一些或全部已缓存位图,并缓存下一个屏幕所需的位图。 下一节对此进行了举例说明。

Screen1View.cppvoid Screen1View::setupScreen()
{//ensure background is cachedBitmap::cache(BITMAP_SCREEN2_ID);//cache some iconsBitmap::cache(BITMAP_ICON10_ID);Bitmap::cache(BITMAP_ICON11_ID);Bitmap::cache(BITMAP_ICON12_ID);
}void Screen1View::tearDownScreen()
{//Remove all bitmaps from the cacheBitmap::clearCache();
}

缓存的存储空间要求是位图使用量最多的屏幕使用的位图大小。 此方法的缺点是如果两个视图都使用一个位图,从第一个视图退出时缓存中的位图会被擦除,并在进入第二个视图时再次缓存。

可对Bitmap::cacheRemoveBitmap使用选择性未缓存位图,从而减少此开销。 cacheRemoveBitmap的缺点是缓存存储空间碎片化。

缓存的另一个普遍缺点是在更改UI(如添加按钮)时,您可能需要更新缓存代码来包含新位图。

上面例子中,用到函数   bool cache(BitmapId id)  , 图片ID可以从TouchGFX Designer中获取

或者到BitmapDatabase.hpp文件中进行查找


http://www.ppmy.cn/news/1112844.html

相关文章

Mapbox加载arcgis的底图

成果图 这种底图基本上都是按照raster来加载的&#xff0c;主要就是知道地址了&#xff0c;拼参数 具体参数请参考官网 https://developers.arcgis.com/rest/services-reference/enterprise/export-map.htm 源码 我的服务列表是这样的 http://XXXX:XXXX/arcgis/rest/services/…

【k8s】kube-proxy 工作模式

文章目录 Userspace模式&#xff1a;iptables模式&#xff1a;负载均衡&#xff08;Load Balancing&#xff09; LB轮询&#xff08;Round Robin&#xff09;&#xff1a;SessionAffinity&#xff1a;最少连接&#xff08;Least Connection&#xff09;&#xff1a;IP哈希&…

uni-app监听页面滚动

在uni-app中可以通过监听页面滚动事件来实现滚动效果或响应滚动事件 在需要监听滚动的页面或组件中&#xff0c;添加一个scroll元素&#xff0c;用于容纳内容并实现滚动效果。 <template><view class"container"><scroll-view scroll-y scroll"…

深入了解==和equals的区别

1. 浅说和equals的区别 &#xff08;1&#xff09;比较的类型 不一样 可以比较基础数据类型和引用类型&#xff0c;比较基础数据类型的数据时比较的是值&#xff0c;比较引用对象时比较的是引用的地址。 equals比较引用类型&#xff0c;默认比较的是两个引用对象的引用地址&a…

python:优化一EXCEL统计用类封装一下

# encoding: utf-8 # 版权所有 2023 涂聚文有限公司 # 许可信息查看&#xff1a; # 描述&#xff1a; # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2023.1 python 311 # Datetime : 2023/9/17 5:40 # User : geovindu # Product : PyCharm # Proj…

redis info 详解(InsCode AI 创作助手)

redis info 详解 选项说明&#xff1a; Redis的INFO命令返回了关于Redis服务器的各种信息和统计数据&#xff0c;这些信息可以帮助您监控和管理Redis实例。INFO命令的输出是一个包含多行文本的字符串&#xff0c;包括了各种不同的信息类别。以下是一些常见的INFO命令输出中包…

[运维|数据库] PostgreSQL数据库对MySQL的 READS SQL DATA 修饰符处理

在 PostgreSQL 中&#xff0c;访问权限通常是通过数据库角色和表级别的权限进行管理&#xff0c;而不需要类似 MySQL 中的 READS SQL DATA 修饰符。 要在 PostgreSQL 中管理数据库对象的访问权限&#xff0c;您可以使用以下 SQL 命令&#xff1a; GRANT&#xff1a;授予用户或…

CS5817规格书|CS5817芯片参数|多功能便携式显示器方案芯片规格

CS5817支持最高4K 60Hz是集睿致远&#xff08;ASL&#xff09; 新推出的多功能显示控制器芯片&#xff0c;CS5817产品可应用于便携显示器、电竞显示器、桌面显示器、一体式台式机和嵌入式显示系统。 Type-C/DP/HDMI2.0输入转LVDS/eDP/VBO 芯片, 高度集成了多种输入输出接口, 并…