我是靠谱客的博主 超级泥猴桃,最近开发中收集的这篇文章主要介绍awtk-linux-fb 使用 double framebuffer 闪烁的问题awtk-linux-fb 使用 double framebuffer 闪烁的问题,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
awtk-linux-fb 使用 double framebuffer 闪烁的问题
有朋友说 awtk-linux-fb 在某某平台闪烁很厉害,log 显示该平台使用的双帧缓冲。从代码和网上查的资料来看,目前的处理方法没有问题:无非就是通过 FBIOPUT_VSCREENINFO 或 FBIOPAN_DISPLAY 去修改 fb_var_screeninfo 的 yoffset。如:
vi.yoffset = i * fb_height(fb);
if (ioctl(fb->fd, FBIOPUT_VSCREENINFO, &vi) < 0) {
perror("active fb swap failed");
}
百思不得其解,前几天找了一台 android 手机,把 zygote 进程停掉了,直接运行 AWTK 的程序,发现只要程序在刷新的时候,屏幕就有显示,停下来了屏幕就黑了。
所以怀疑不管 GUI 有没有变化,都必须不停的调用 FBIOPUT_VSCREENINFO 向显卡提交显示请求。
于是就开了一个独立的线程,来做这件事情:
static void* display_thread(void* ctx) {
uint32_t i = 0;
uint32_t index = 0;
fb_info_t* fb = &s_fb;
int fb_nr = fb_number(fb);
uint32_t size = fb_size(fb);
lcd_mem_t* lcd = (lcd_mem_t*)ctx;
struct fb_var_screeninfo vi = (fb->var);
log_info("display_thread startn");
while (!s_app_quited) {
uint8_t* buff = fb->fbmem0 + size * i;
uint32_t start = time_now_ms();
vi.yoffset = i * fb_height(fb);
pthread_mutex_lock(&s_mutex);
memcpy(buff, lcd->offline_fb, size);
pthread_mutex_unlock(&s_mutex);
if (ioctl(fb->fd, FBIOPUT_VSCREENINFO, &vi) < 0) {
perror("active fb swap failed");
}
index++;
i = index % fb_nr;
}
log_info("display_thread endn");
return NULL;
在 android 设备上测试 2fb/3fb 的情况,显示均正常了。
以前一直认为:提交一次之后,显卡自动使用该数据显示,直到有新的数据提交为止。而实际情况是需要不停的提交,否则屏幕就黑了。
最后
以上就是超级泥猴桃为你收集整理的awtk-linux-fb 使用 double framebuffer 闪烁的问题awtk-linux-fb 使用 double framebuffer 闪烁的问题的全部内容,希望文章能够帮你解决awtk-linux-fb 使用 double framebuffer 闪烁的问题awtk-linux-fb 使用 double framebuffer 闪烁的问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复