我需要在没有X11的Linux下在屏幕上画一个光标(鼠标指针)。这适用于嵌入式系统,在嵌入式系统中,所有其他绘图都直接发生在一个框架缓冲区(/dev/fb0)中。
FBIO_WAITFORVSYNC)同步。在什么是硬件光标,它是如何工作的?中,OP声称已经通过ioctl调用实现了这一点,声称它很简单,但是拒绝提供更多的细节,因为他的代码是专有的。我知道FBIO_CURSOR,但它似乎是不标准的,总是在我的3.10.0内核上返回EINVAL。
在没有X11的情况下,绘制框架缓冲区游标的正确方法是什么?
发布于 2016-07-06 13:10:31
最后,我滚动了自己的游标支持,因为内核支持似乎依赖于特定的视频驱动程序所支持的任何东西。这场演出对我的目的来说是很棒的。我所做的是:
mmap框架缓冲区,和malloc两个缓冲区大小相同的帧缓冲区。其中一个缓冲区是我的后缓冲区,所有的绘图都发生在这里。另一个是我绘制游标的“游标”缓冲区。poll。我使用了一个500毫秒的超时,并将其放入pthread中,这样它的性能开销就非常小。memcpy‘将回存缓冲区放入游标缓冲区,并将光标绘制在光标的上方。(我删除光标下面的掩码位,并按照图像这里绘制游标位。)然后光标缓冲区被memcpy’编辑到帧缓冲区中。我的一些决定有几个原因:
malloc'ed内存作为后台和游标缓冲区。memcpy比我能写的任何东西都快得多,而且线程安全。memcpy在试图访问当前正在使用的区域时锁定区域和块。这就是为什么我使用两个互斥保护从后缓冲区到游标缓冲区和从游标缓冲区到帧缓冲区的副本。poll超时的0等同于使用大量CPU周期的紧循环,因此使用非零超时。但是,只要输入上有活动,poll就会返回,所以响应性很好。在我的硬件上,我没有找到一种与垂直消隐同步的可用方法(有些ioctl显然没有操作),但上面描述的方法并没有显示出特定的撕裂。是的,这种方法使用了两个屏幕外缓冲区,每个缓冲区在1920年x 1080 16位/像素屏幕上需要4MB,但它非常简单,足以满足我的需要。
https://stackoverflow.com/questions/37971833
复制相似问题