Linux framebuffer图形和VSync

时间:2012-12-16 14:10:17

标签: linux graphics framebuffer

我在C中制作适用于linux framebuffer的游戏。到目前为止,我有一个红色的100x100正方形,与鼠标一起移动,就像指针一样。我实现了双缓冲,它工作正常(方块不闪烁)。问题是,横向发生了很多撕裂事件。我的意思是,当正方形在x轴上移动时,它就像它被水平分割,并且它的一部分比另一部分更加柔和。如果我继续移动它,这个“裂口”会在广场上从上到下慢慢传播。

我相信这是因为在我将双缓冲区复制到主缓冲区的那一刻,硬件会读取帧缓冲区。

我试图用FBIO_WAITFORVSYNC ioctl解决这个问题,但没有成功。

我有什么想法可以在帧缓冲区上做VSync吗?请在您的解释中添加详细信息,因为这是我第一次在基于Linux的操作系统上编写这样的东西,所以我可能不会理解。

这是我的代码:http://pastebin.com/KJ4iaVEL

2 个答案:

答案 0 :(得分:7)

这不是进行双缓冲的正确方法。你可以在后台缓冲区上进行所有绘画,但是你可以使用memcpy将数据传输到前面。复制过程中很容易发生屏幕刷新。

要正确执行此操作,您只需切换指向数据的指针;不要复制数据本身。使用Linux帧缓冲设备,这是通过具有两倍于物理屏幕的“虚拟”屏幕并使用偏移变量来设置是显示上半部分还是下半部分来完成的。您可以使用FBIOGET_VSCREENINFOFBIOPUT_VSCREENINFOFBIOPAN_DISPLAY ioctl来电查询大小和设置偏移量。

此页面简要介绍了有关此内容的一些细节:http://www.ummon.eu/Linux/API/Devices/framebuffer.html

所有相关数据结构都在linux/fb.h头文件中。

答案 1 :(得分:1)

不幸的是,我已经了解了@Steven Bell的答案并不是很正确。虽然他是正确的,在memcpy期间很容易发生屏幕刷新,但正确的分辨率不是创建一个双倍大小的屏幕虚拟帧缓冲区,而是像许多线程所暗示的那样在它们之间平移。尝试此解决方案的任何人都会收到此处描述的错误:invalid argument error when setting yres_virtual in fb_var_screeninfo

根据这个帖子:https://forum.odroid.com/viewtopic.php?f=55&t=8741真的不能对帧缓冲区进行双重缓冲(/ dev / fb0,尽管我听说过树莓PI可能是这个规则的一个例外)。但这并不意味着没有办法在Linux中使用低级图形加倍缓冲。

这里的真正解决方案是使用libdrm(/ dev / dri / card0)将低级图形绘制到屏幕上。这里有一个非常好的例子:https://github.com/dvdhrm/docs/blob/master/drm-howto/modeset-vsync.c我在试图解决这个问题时就习惯了。{/ p>

无论如何,我希望我能救出一个人,这是我将来必须要解决的一个令人头痛的问题。