硬件光标是什么?它如何工作?

34

有人能准确地解释一下硬件光标是如何工作的吗?它与我在屏幕上绘制的图形有什么关系?我正在使用OpenGL进行绘制,硬件光标与OpenGL图形有什么关系?

编辑:对于将来可能感兴趣的人,我刚刚实现了使用硬件显示光标所需的内容。 实现在内核中进行,只需使用简单的ioctl即可。 完美运行。


1
嗨,Luca,我很感兴趣看到你的代码,其中包含硬件光标的ioctls,而不需要X11!你能链接你的代码或描述如何执行此操作的页面/手册吗?谢谢。 - Sam Watkins
专有代码,抱歉。我只能添加关于我如何实现它的信息。 - Luca Carlon
我很想看到这样的信息!例如,请参考Linux回答您自己的问题,我会为您投票 :) (或发送消息至sam@nipl.net - Sam Watkins
我在多年前的问题中已经添加了相关信息。我使用系统调用来移动屏幕指针并设置与要显示为光标的图像相关的数据。我将此实现在我的环境的光标驱动程序中,当时我的环境是嵌入式Linux的Qt。我认为没有更多可说的了,这非常简单。 - Luca Carlon
3个回答

45

硬件光标是指GPU提供的绘制在屏幕帧缓冲区上的(小型)覆盖图像,其位置可以通过GPU上的两个寄存器(或者其他方式)进行更改。因此,移动指针不需要重新绘制先前被遮挡的帧缓冲区部分。

与OpenGL的关系:没有!


1
@Luca:确实。OpenGL只是将图形绘制到屏幕帧缓冲区的一种方式。但无论如何,硬件光标都独立于此工作。 - datenwolf
1
@Luca:显然,硬件加速的光标是最好的解决方案。无论是否进行硬件加速,在OpenGL场景中更改一个位需要重新渲染整个场景(或使用缓存纹理)。硬件光标只需工作,并且易于使用;只需使用图形系统的标准光标图像设置函数(在Windows中为SetCursor,在X11中为XCursor,在MacOS X中我不知道,但手册知道;)-使用正确安装的图形驱动程序,您将自动获得硬件加速的光标。 - datenwolf
1
很不幸的是,我并没有使用Windows、X11或者MacOS X :-) 这就是为什么这个主题的细节对我来说很重要。谢谢! - Luca Carlon
@Luca:硬件光标是由图形驱动程序实现的。在Xorg的情况下,这是由Xorg驱动程序完成的。EGL和QWS建立在Mesa之上,Mesa再次使用DRI/DRM(如果有开源驱动程序,则不适用于NVidia)。应该在其中某个地方支持HW光标,但不要问我具体在哪里。然而,并没有通用的HW光标库,因为这高度依赖于硬件。 - datenwolf
硬件光标是由硬件实现的。但是OpenGL(或DirectX)不是你与该硬件通信的窗口(门户,网关,通信方法)吗?我想我在问:您如何告诉计算机安装的视频卡“在这里”绘制光标的品牌? - Ian Boyd
显示剩余10条评论

15

硬件光标并不是由OpenGL渲染或支持的。某些小型硬件会将其覆盖在输出显示器上的任何图像上 - 它会直接插入到每个帧的扫描输出位流中。因此,可以通过更改包含其坐标的一对硬件寄存器来移动它。在早期,它们被称为“sprites”,并且在不同系统上支持不同数量的它们。


你认为这是高性能图形界面显示光标的常见或最佳方式吗?谢谢! - Luca Carlon

12

硬件光标具有较低的延迟,因此提供更好的体验,因为它们不受您的游戏或引擎帧率的限制,而是与屏幕刷新率相对应。

然而,软件光标由您在渲染循环期间呈现为屏幕空间精灵,并且必须以您的游戏引擎速率运行。因此,如果您的游戏经历延迟或其他情况导致帧率低于目标fps,则光标延迟将变得更糟。游戏fps的轻微下降通常是可以接受的,但是光标延迟的轻微下降非常明显,会表现为“缓慢的光标”。

您可以通过在保留硬件光标的同时呈现软件光标来轻松测试此功能。(FYI,在Windows API中,硬件光标函数是ShowCursor)。您会发现软件光标落后于硬件光标。


再加一点,以便简单地看到差异的方法! - Dan Henderson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接