Мне интересно, как правильно удвоить буфер кадра, чтобы избежать разрывов. Я провел много исследований по этой теме и, похоже, ничего не нашел.
Я пробовал FBIO_WAITFORVSYNC. Но по этой теме: Как запросить фазу Vsync в Linux кажется что это не сработает.
Я также пробовал использовать FBIOGET_VSCREENINFO и FBIOPAN_DISPLAY для этого потока: графика фреймбуфера Linux и VSync . Но это не удалось из-за ошибки, обсуждаемой в этом потоке: ошибка неверного аргумента при установке yres_virtual в fb_var_screeninfo
В этом потоке было предложено использовать другой драйвер (vesafb) для устранения ошибки. Мне удалось установить uvesafb на моем компьютере, но ошибка «Недопустимый аргумент» не исчезла.
Я также пробовал просто создать буфер большего размера по предложению этого человека: http://betteros.org/tut/graphics1.php#doublebuffer, но mmap продолжает возвращать -1.
Я также попытался реализовать обсуждаемое здесь решение: https://pyra-handheld.com/boards/threads/my-frustrating-experiences-with-dev-fb.21062/. Однако поток умер без публикации фактического решения, и я сомневаюсь в эффективности замены аппаратных адресов (или если это вообще возможно).
Любая помощь будет принята с благодарностью по этой теме!
По запросу вот код, который я в идеале хотел бы приступить к работе:
fb0 = open("/dev/fb0", O_RDWR);
if(fb0 == 0)
error("Could not open framebuffer located in /dev/fb0!");
if (ioctl(fb0, FBIOGET_FSCREENINFO, &screeninfo_fixed) == -1)
error("Could not retrive fixed screen info!");
if (ioctl(fb0, FBIOGET_VSCREENINFO, &screeninfo_var) == -1)
error("Could not retrive variable screen info!");
screeninfo_var.xres_virtual = screeninfo_var.xres;
screeninfo_var.yres_virtual = screeninfo_var.yres * 2;
screeninfo_var.width = screeninfo_var.xres;
screeninfo_var.height = screeninfo_var.yres;
screeninfo_var.xoffset = 0;
screeninfo_var.yoffset = 0;
if (ioctl(fb0, FBIOPUT_VSCREENINFO, &screeninfo_var) == -1)
error("Could not set variable screen info!");
Это всегда будет напечатать "Не удалось установить переменную информацию об экране!" из-за некоторых проблем с увеличением размера виртуального буфера кадра.
fb0 = open("/dev/fb0", O_RDWR); if(fb0 == 0) error("Could not open framebuffer located in /dev/fb0!");
Функция:open()
всегда возвращает значение ‹0 при сбое (тогда код должен вызыватьperror()
, поэтому текстовая причина, по которой система считает, что функция не выполнена, записывается вstderr
0, является допустимым возвращаемым значением (хотя код должен это значение видно только в том случае, еслиstdin
был закрыт - person user3629249   schedule 05.04.2018open()
завершается неудачно, после отображения сообщения об ошибке код должен вызыватьexit()
, посколькуfile descriptor
недоступен для обеспечения доступа к файлу. - person user3629249   schedule 05.04.2018