首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要在Linux框架缓冲区中绘制游标

需要在Linux框架缓冲区中绘制游标
EN

Stack Overflow用户
提问于 2016-06-22 15:02:35
回答 1查看 2.2K关注 0票数 1

我需要在没有X11的Linux下在屏幕上画一个光标(鼠标指针)。这适用于嵌入式系统,在嵌入式系统中,所有其他绘图都直接发生在一个框架缓冲区(/dev/fb0)中。

  1. 我目前正在查看的GUI库不提供任何游标支持。
  2. 我可以自己动手,但我关心的是外观和性能,部分原因是我似乎无法与vsync (FBIO_WAITFORVSYNC)同步。
  3. 我知道几乎所有的图形芯片都支持硬件游标,但是DirectFB已经死了,libdrm需要X11,对于Mesa也是如此。

什么是硬件光标,它是如何工作的?中,OP声称已经通过ioctl调用实现了这一点,声称它很简单,但是拒绝提供更多的细节,因为他的代码是专有的。我知道FBIO_CURSOR,但它似乎是不标准的,总是在我的3.10.0内核上返回EINVAL

在没有X11的情况下,绘制框架缓冲区游标的正确方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-06 13:10:31

最后,我滚动了自己的游标支持,因为内核支持似乎依赖于特定的视频驱动程序所支持的任何东西。这场演出对我的目的来说是很棒的。我所做的是:

  • 打开/dev/fb0帧缓冲区,根据需要调整vinfo,mmap框架缓冲区,和malloc两个缓冲区大小相同的帧缓冲区。其中一个缓冲区是我的后缓冲区,所有的绘图都发生在这里。另一个是我绘制游标的“游标”缓冲区。
  • 打开适当的/dev/ the /eventX,为读取鼠标事件做准备。
  • 定义一个“刷新”函数,每当有什么东西被拖到后台缓冲区时,或者当鼠标活动时,就调用它。
  • 具有合理超时的鼠标事件的poll。我使用了一个500毫秒的超时,并将其放入pthread中,这样它的性能开销就非常小。
  • “刷新”函数memcpy‘将回存缓冲区放入游标缓冲区,并将光标绘制在光标的上方。(我删除光标下面的掩码位,并按照图像这里绘制游标位。)然后光标缓冲区被memcpy’编辑到帧缓冲区中。
  • (为了更好的性能,我用两个互斥锁保护刷新功能。在将后缓冲区复制到游标缓冲区并在绘制游标后释放它之前,我将获取第一个。在绘制游标之前获取第二个游标,并在将游标缓冲区复制到buffer缓冲区后释放它。在进行大量非常快速的绘图时,这明显提高了性能。)

我的一些决定有几个原因:

  • 写入框架缓冲区的速度相当快,但读取速度要慢得多,因此使用常规的malloc'ed内存作为后台和游标缓冲区。
  • memcpy比我能写的任何东西都快得多,而且线程安全。
  • 并发访问框架缓冲区的速度很慢,大概是因为memcpy在试图访问当前正在使用的区域时锁定区域和块。这就是为什么我使用两个互斥保护从后缓冲区到游标缓冲区和从游标缓冲区到帧缓冲区的副本。
  • 具有poll超时的0等同于使用大量CPU周期的紧循环,因此使用非零超时。但是,只要输入上有活动,poll就会返回,所以响应性很好。

在我的硬件上,我没有找到一种与垂直消隐同步的可用方法(有些ioctl显然没有操作),但上面描述的方法并没有显示出特定的撕裂。是的,这种方法使用了两个屏幕外缓冲区,每个缓冲区在1920年x 1080 16位/像素屏幕上需要4MB,但它非常简单,足以满足我的需要。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37971833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档