ST意法半导体
直播中

蔡鼎瑾

7年用户 1013经验值
私信 关注
[问答]

怎样去解决使用DMA2D执行复杂动画时屏幕边界切换的问题呢

大家好,
我目前正在使用 Touchgfx 在带有 STM32F469II 和 RGB565 格式的 1024x600 屏幕的自定义板上开发一个项目。我正在使用一个以 100 MHz 运行的外部闪存和一个 8 MB 的外部 SDRAM,其中有 4 个存储体,如下所示:
  • 第一个库包含第一个帧缓冲区。
  • 第二个库包含第二个帧缓冲区(用于多缓冲)。
  • 第三行是动画存储空间(用于屏幕之间的滑动过渡)。
  • 第三行和第四行的末尾包含动态位图缓存,我将SD卡中的图片放入其中(我的8MB外部闪存已经满了)。
我遇到了一个问题,当我执行一些动画时,屏幕的一部分水平交换(参见我复制的图片)。这种情况一次发生一帧或两帧,但非常明显。这是我可以收集的信息:
  • 只有当 DMA2D 打开时才会发生这种情况(如果我停止它,MCU 负载达到 80% 以上,屏幕明显滞后很多,同时 fps 下降到低于 20,此时会发生错误)。
  • 这个问题只发生在:
    • 1) 在幻灯片屏幕转换之前(看起来像“Background_error_2.png”)但不是在实际动画期间。
    • 2) 在使用滚动容器时连续(看起来更像“Background_error_1.png”
    • 3) 而另一个任务正在后台执行资源消耗操作(比如从 SD 卡导入多张图片)
  • 使用滑块、使用模拟时钟、使用存储在位图缓存中的图片执行动画时,不会发生此问题,...
  • 如果我删除除滚动容器之外的所有内容或仅使用框小部件在屏幕之间执行转换,摇晃仍然存在(尽管屏幕上同时发生的事情越多,最糟糕的是)。
  • 交换永远不会在显示器的上下部分之间垂直发生。它始终是屏幕的右侧部分出现在屏幕的最左侧部分。
几个月来我一直在这个问题上断断续续,到目前为止我已经尝试过:
  • 移动/增加帧缓冲区大小(当帧缓冲区在外部 RAM 中的 2 个库之间共享时,抖动会变得更糟)。
  • 更改屏幕参数,例如 LCD-TFT 时钟(最高 48 MHz)、水平/垂直同步宽度(最低 2 个像素)、像素格式……
  • 移除只会减慢屏幕速度但抖动仍然存在的帧速率补偿(与禁用 DMA2D 时不同,它消除了问题但随后跳过了很多帧并且显示滞后)。
  • 将 DMA 锁定或解锁到前端,这不会明显改变任何内容。
  • 删除位图缓存。
  • 换板和屏幕。
我猜这一定是一个性能问题,但我看不出我必须做些什么才能让它变得更好(我在 touchGFX 网站上看到了一些获得良好性能的技巧,但似乎没有什么可以解决的)。









回帖(1)

杨阳

2022-12-19 14:56:59
主要尝试将 LCD 时钟调低 20-30MHz。在大屏幕上预加载下一个屏幕块实际屏幕或预加载任何复杂的对象
这个问题只发生在:


  • 在幻灯片屏幕转换之前
举报

更多回帖

发帖
×
20
完善资料,
赚取积分