T113/A40i平台QT界面更新频繁遇到界面卡顿问题解决

1.问题现象

项目使用的QT界面在频繁更新界面时候,比如需要画多条波形时候遇到卡顿现象

2.解决方法

可以考虑使用双缓冲,平台底层驱动已经支持到双缓冲机制,具体代码如下

T113/A40i平台QT界面更新频繁遇到界面卡顿问题解决_第1张图片

T113/A40i平台QT界面更新频繁遇到界面卡顿问题解决_第2张图片3.应用

写一个测试demo

int main() {
    int fb = open("/dev/fb0", O_RDWR);
    if (fb == -1) {
        perror("Unable to open framebuffer");
        return 1;
    }

    struct fb_var_screeninfo vinfo;

    ioctl(fb, FBIOGET_VSCREENINFO, &vinfo);

    printf("vinfo.xres=%d, vinfo.yres=%d\n", vinfo.xres, vinfo.yres);
    printf("vinfo.xres_virtual=%d, vinfo.yres_virtual=%d\n", vinfo.xres_virtual, vinfo.yres_virtual);

    ioctl(fb, FBIOGET_VSCREENINFO, &vinfo);

    unsigned char *fbp = mmap(0, vinfo.yres_virtual * vinfo.xres * BYTES_PER_PIXEL, PROT_READ | PROT_WRITE, MAP_SHARED, fb, 0);

    // 填充第一个缓冲区
    for (int y = 0; y < vinfo.yres; y++)
        for (int x = 0; x < vinfo.xres; x++)
            *((unsigned long*)(fbp + 4*x + 4*y*vinfo.xres)) = 0xFF00FFFF;

    // 填充第二个缓冲区
    for (int y = vinfo.yres; y < 2*vinfo.yres; y++)
        for (int x = 0; x < vinfo.xres; x++)
            *((unsigned long*)(fbp + 4*x + 4*y*vinfo.xres)) = 0xFFFF00FF;



    int i = 0;
    while(1)
    {
        // 切换到第二个缓冲区
        vinfo.yoffset = (i++%2)*HEIGHT;
        printf("vinfo.yoffset = %d\n", vinfo.yoffset);

        if(0 != ioctl(fb, FBIOPAN_DISPLAY, &vinfo))
        {
                printf("fb iopan display error.\n");
        }

        sleep(1);
    }


    munmap(fbp, vinfo.yres_virtual * vinfo.xres * BYTES_PER_PIXEL);
    close(fb);

    return 0;
}

4.测试结果

可以测试双缓冲,在T113上面测试通过,编译后交替显示紫色和淡蓝色

你可能感兴趣的:(嵌入式,qt,数据库,开发语言,全志A64)