LVGL8 driver problem on linux platform

Hi. In order to improve the FPS of LVGL, I tried to use the memory obtained by mmap of the /dev/fb0 interface of the LINUX platform as draw_buf, but there would be flickering.
On my SOC platform, FRAMEBUFFER supports the FBIOPAN_DISPLAY command. So I want to switch screens in flush_cb to avoid flickering caused by direct access to the screen.
The following code is LVGL initialization:

    fbfd = open("/dev/fb0", O_RDWR);
    if (fbfd == -1)
        return -1;

    if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo) == -1)
        perror("Error reading fixed information");
        return -1;
    if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo) == -1)
        perror("Error reading variable information");
        return -1;
    fbp = (char *)mmap(0, finfo.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fbfd, 0);

    lv_disp_draw_buf_init(&disp_buf, fbp, fbp + vinfo.xres * vinfo.yres * 4, vinfo.xres * vinfo.yres);
    disp_drv.draw_buf = &disp_buf;
    disp_drv.flush_cb = gpu_flush;
    disp_drv.hor_res = vinfo.xres;
    disp_drv.ver_res = vinfo.yres;
    disp_drv.full_refresh = 1;

The following code is LVGL flush_cb:

    static bool pan_state = false;
    if (pan_state)
        vinfo.yoffset = vinfo.yres;
        vinfo.yoffset = 0;
    pan_state = !pan_state;

    if (ioctl(fbfd, FBIOPAN_DISPLAY, &vinfo) == -1)
        printf("Error: failed to FBIOPAN_DISPLAY\n");

The following code is main:

    while (1)

I found that changing usleep in the main function to 10000 can avoid screen flickering.
my lv_conf.h
/Default display refresh period. LVG will redraw changed ares with this period time/
#define LV_DISP_DEF_REFR_PERIOD 10 /[ms]/

/Input device read period in milliseconds/
#define LV_INDEV_DEF_READ_PERIOD 1 /[ms]/

This is to capture the flashing moment of the screen