我正在用C语言制作适用于linux framebuffer的游戏.到目前为止,我有一个红色的100x100正方形,与鼠标一起移动,就像指针一样.我实现了双缓冲,它工作正常(方块不闪烁).问题是,横向发生了很多撕裂事件.我的意思是,当正方形在x轴上移动时,它就像它被水平分割,并且它的一部分比另一部分更加柔和.如果我继续移动它,这个"裂口"会在广场上从上到下慢慢传播.
我相信这是因为硬件在我将双缓冲区复制到主缓冲区的那一刻读取帧缓冲区.
我试图用FBIO_WAITFORVSYNC ioctl解决问题,但没有成功.
我有什么想法可以在帧缓冲区上做VSync吗?请在您的解释中添加细节,因为这是我第一次在基于Linux的操作系统上编写这样的东西,所以我可能不会理解.
这是我的代码:http://pastebin.com/KJ4iaVEL
小智 7
这不是进行双缓冲的正确方法.你可以在后台缓冲区上进行所有绘画,但是你可以使用memcpy将数据传输到前面.复制过程中很容易发生屏幕刷新.
要正确地执行此操作,您只需要切换指向数据的指针 ; 不要复制数据本身.使用Linux帧缓冲设备,这是通过具有两倍于物理屏幕的"虚拟"屏幕并使用偏移变量来设置是显示上半部分还是下半部分来完成的.您可以查询的大小和使用的设定偏移FBIOGET_VSCREENINFO,FBIOPUT_VSCREENINFO和FBIOPAN_DISPLAY ioctl电话.
本页简要介绍了一些有关此内容的详细信息:http://www.ummon.eu/Linux/API/Devices/framebuffer.html
所有相关的数据结构都在linux/fb.h头文件中.
不幸的是,我经过惨痛的教训才知道@Steven Bell 的答案并不完全正确。尽管他是对的,在 memcpy 期间很容易发生屏幕刷新,但正确的解决方案不是创建一个两倍于屏幕大小的虚拟帧缓冲区并在它们之间平移,正如许多线程所建议的那样。任何尝试此解决方案的人都会收到此处描述的错误:在 fb_var_screeninfo 中设置 yres_virtual 时出现无效参数错误。
根据此线程:https://forum.odroid.com/viewtopic.php ?f=55&t=8741 不太可能真正双缓冲帧缓冲区(/dev/fb0,尽管我听说树莓派可能是此规则的例外)。但这并不意味着没有办法在 Linux 中使用低级图形来双缓冲。
这里真正的解决方案是使用 libdrm (/dev/dri/card0) 将低级图形绘制到屏幕上。这里有一个非常好的示例说明如何执行此操作: https: //github.com/dvdhrm/docs/blob/master/drm-howto/modeset-vsync.c,当我尝试解决此问题时我自己使用了它。
无论如何,我希望我已经让某人免去了我将来必须经历的令人头痛的问题。