• TouchGFX之缓存位图


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

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


     

    配置屏幕显示图片

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

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

    位图缓存配置

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

    1. TouchGFXHAL.cpp
    2. LOCATION_PRAGMA_NOLOAD("TouchGFX_Cache")
    3. uint16_t Cache[1024 * 604] LOCATION_ATTRIBUTE_NOLOAD("TouchGFX_Cache");
    4. void TouchGFXHAL::initialize()
    5. {
    6. // Calling parent implementation of initialize().
    7. //
    8. // To overwrite the generated implementation, omit call to parent function
    9. // and implemented needed functionality here.
    10. // Please note, HAL::initialize() must be called to initialize the framework.
    11. TouchGFXGeneratedHAL::initialize();
    12. Bitmap::setCache(Cache, sizeof(Cache));
    13. Bitmap::cacheAll();
    14. HAL_GPIO_WritePin(LCD_BL_GPIO_Port, LCD_BL_Pin, GPIO_PIN_SET);
    15. }
    1. TouchGFX.sct
    2. ; *************************************************************
    3. ; *** Scatter-Loading Description File generated by uVision ***
    4. ; *************************************************************
    5. LR_IROM1 0x08000000 0x00200000 { ; load region size_region
    6. ER_IROM1 0x08000000 0x00200000 { ; load address = execution address
    7. *.o (RESET, +First)
    8. *(InRoot$$Sections)
    9. .ANY (+RO)
    10. .ANY (+XO)
    11. }
    12. RW_IRAM1 0x20000000 0x00020000 { ; RW data
    13. .ANY (+RW +ZI)
    14. }
    15. RW_IRAM2 0x24000000 0x00080000 {
    16. *(.RAM_D1)
    17. }
    18. RW_IRAM3 0x30000000 0x00048000 {
    19. *(.RAM_D2)
    20. }
    21. RW_IRAM4 0x38000000 0x00010000 {
    22. *(.RAM_D3)
    23. }
    24. RW_IRAM5 0xC0000000 UNINIT 0x02000000 {
    25. *(.RAM_SDRAM)
    26. *.o (TouchGFX_Framebuffer)
    27. *.o (TouchGFX_Cache)
    28. }
    29. }
    30. LR_ROM1 0x90000000 0x02000000 {
    31. ER_ROM1 0x90000000 0x02000000 { ; load address = execution address
    32. *.o (ExtFlashSection)
    33. ; *.o (TextFlashSection)
    34. ; *.o (FontFlashSection)
    35. }
    36. }

    关闭外部闪存存储器映射

    修改blockCopy函数

    1. TouchGFXHAL.cpp
    2. bool TouchGFXHAL::blockCopy(void* RESTRICT dest, const void* RESTRICT src, uint32_t numBytes)
    3. {
    4. // return TouchGFXGeneratedHAL::blockCopy(dest, src, numBytes);
    5. for(uint32_t i = 0; i < numBytes / 2; i++)
    6. *((uint16_t *)dest + i) = 0xFFFF;
    7. return true;
    8. }

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

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

    缓存策略

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

    1. Screen1View.cpp
    2. void Screen1View::setupScreen()
    3. {
    4. //ensure background is cached
    5. Bitmap::cache(BITMAP_SCREEN2_ID);
    6. //cache some icons
    7. Bitmap::cache(BITMAP_ICON10_ID);
    8. Bitmap::cache(BITMAP_ICON11_ID);
    9. Bitmap::cache(BITMAP_ICON12_ID);
    10. }
    11. void Screen1View::tearDownScreen()
    12. {
    13. //Remove all bitmaps from the cache
    14. Bitmap::clearCache();
    15. }

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

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

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

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

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

  • 相关阅读:
    Mysql之进阶查询语句
    electron+vite+vue3项目打包
    经典算法之快速排序
    CSGO饰品持续跌价,市场真的要崩盘了吗?
    RK3399平台开发系列讲解(PCI/PCI-E)5.51、PCIE EP模式软件架构
    [NOIP2000 提高组] 乘积最大
    [AR Foundation] AR Foundation学习之路(持续记录)
    Python:实现deutsch jozsa算法(附完整源码)
    数据结构:交换排序
    JuiceFS 即将发布 1.0 并调整开源许可
  • 原文地址:https://blog.csdn.net/lushoumin/article/details/132845414