lvgl刷新

背景:lvgl 的display部分.由于有些场景显示需要同时刷新视频帧和ui,为了防止不同步的现象,刷新是基于视频帧的速率去刷新的.同时为了防止出现拉窗帘现象(即ui渲染过程被视频的刷新显示处理),使用了双buffer

问题:有时会出现自动刷新的文本和按钮点击效果在同一个buff中刷新,并且这两次刷新都会自动调用flush_cb,这就导致局部拉窗帘的现象.比如说先刷新了提示文本的显示,按钮出现拉窗帘现象.看flush_cb的参数,两次都是在同一个buffer中渲染,.

请问各位大佬,有没有办法能够确保这些刷新在不同的bufferr中

视频的刷新率是高于ui的刷新率的么?不要在多线程中刷新ui;

1 个赞

是的.我的视频帧刷新和ui刷新并不是在同一个线程中.视频的刷新率应该会高于ui.因为有视频时ui的负载较大,刷新率比平常低很多

那如果我想要解决这个问题的话,应该怎么做呢?能否请教下大致的思路

感觉你的问题其实是多线程刷新导致的问题,而不是双buffer导致的。一般lvgl只用来做osd层吧,你的视频帧也需要由lvgl绘制么?视频帧和osd的混合叠加由什么完成?

1 个赞

视频帧由视频插件把视频数据发来.然后手动调用一次flush_cb.

flush_cb中视频帧和osd的混合叠加由芯片厂商提供的接口进行图层拷贝.先拷贝视频,然后拷贝osd,osd的穿透基于color key实现,两者叠加就是最后的画面输出给屏幕.

由于视频帧和lvgl屏幕的渲染是不同步的,为了让画面同步,当前带视频的ui显示是以视频的刷新为准.ui刷新时调用lv_display_flush_ready(display);后就退出了,不会进行绘制刷新屏幕.

flush_cb的实现中有加锁,所以认为多线程应该影响没有那么大.

不过当时为了防止ui线程被锁阻塞,所以lv_display_flush_ready(display);没有被锁覆盖.会不会是这个原因?

那按你场景,视频帧实际不用经过lvgl,比如视频帧经过编码后得到12801024 的argb8888 buffer0,实际你只需要把lvgl当前屏幕设为透明,osd绘制在12801024 的argb8888 buffer1上,最后使用芯片厂商提供的接口进行视频帧叠加就行了。

1 个赞

我好像知道该怎么做了,多谢.我先试一下