我正在用C一个游戏,在Linux的framebuffer的作品。 到目前为止,我有一个红色的方形100×100,在串联移动鼠标,就像一个指针。 我已经实现了双缓冲,它工作正常(方不闪烁)。 问题是,有相当水平发生了很多撕裂。 我的意思是,当在x轴上方移动,就好像它被水平分割,它的一个部分前进slithgly比对方多。 这种“哧”由上到广场上的底部慢慢传播,如果我继续前进吧。
我相信这是因为硬件的那一刻时读取帧缓冲,当我的双缓冲区拷贝到主缓冲区。
我试图打击与FBIO_WAITFORVSYNC IOCTL的问题,但没有获得成功。
任何想法我怎么能在帧缓冲上做垂直同步? 请详述您的解释,因为这是我第一次在基于Linux操作系统的编程这样的东西,所以我可能不明白,否则。
这里是我的代码: http://pastebin.com/KJ4iaVEL
这不是做双缓冲的正确方法。 你说得对做一个反向缓冲区中的所有绘画,但你做的memcpy将数据传输到前面。 屏幕刷新可以在复制过程中很容易发生。
为了正确地做到这一点,你应该只需要一个指针切换到数据 ; 不复制数据本身。 随着Linux的帧缓冲设备,这是通过一个“虚拟”屏幕的两倍大的物理屏幕,并采用偏移变量来设置你是否正在展示的顶部或底部的一半。 您可以查询的大小和使用的设定偏移FBIOGET_VSCREENINFO
, FBIOPUT_VSCREENINFO
和FBIOPAN_DISPLAY
ioctl
调用。
此页面简要给出了关于这个的一些细节: http://www.ummon.eu/Linux/API/Devices/framebuffer.html
所有相关的数据结构是在linux/fb.h
头文件。
不幸的是我已经学会了@Steven贝尔的回答是不完全正确的艰辛的道路。 虽然他的memcpy的过程中是正确的,屏幕刷新很容易出现正确的分辨率不是创建屏幕大小的两倍的其中间的虚拟帧缓冲和泛既然这么多线程建议。 :任何人谁尝试这种解决方案将得到这里所描述的错误在fb_var_screeninfo设置yres_virtual时无效的参数错误 。
每本主题: 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 ,我用我自己,当我试图解决这个问题。
不管怎样,我希望我已经得救的人惊人的头痛,我不得不通过在未来想出解决办法。