我正在使用Xlib和GLX在Linux中编写OpenGL应用程序。我想使用鼠标指针绘制和拖动窗口中的对象。但无论我用什么方法绘制或移动图形对象,实际的鼠标指针位置(由X服务器绘制)和我用指针坐标绘制的对象的位置之间总是存在非常明显的延迟。 Xlib(XQueryPointer或X事件)或直接从/ dev / input / event *
读取所以我的问题是:XOrg服务器使用什么代码在屏幕上实际绘制鼠标指针?因此,我可以使用相同类型的代码将图形放置在屏幕上,并使鼠标指针和图形对象位置始终完全对齐。
即使是指向XOrg相关源文件的指针也会很棒。
答案 0 :(得分:2)
所以我的问题是:XOrg服务器使用什么代码在屏幕上实际绘制鼠标指针?
如果一切顺利,根本没有代码绘制鼠标指针。所谓的“硬件光标”支持已存在数十年。基本上它是硬件中被称为“精灵引擎”的东西,它带有一些小图片和一对值(x,y),它将出现在屏幕上。在图形硬件发送到显示器的每一帧,光标图像都覆盖在特定位置。
图形系统会根据输入设备的移动不断更新位置值。
当然还有图形硬件没有这种“精灵引擎”。但这里的诀窍是,经常更新,快速更新和更新。
但是无论我用什么方法绘制或移动图形对象,实际鼠标指针位置(由X服务器绘制)和我用指针坐标绘制的对象的位置之间总是存在非常明显的延迟。我从Xlib(XQueryPointer或X事件)或直接从/ dev / input / event *
读取
是的,如果您在错误的时间将其整合到图像中,则会发生这种情况。最小化延迟的关键因素是尽可能晚地绘制并尽可能长时间地集成尽可能多的输入,然后才能完成绘制以满足V-Sync截止日期的要求。最重要的技巧不是绘制过去的内容,而是绘制图片出现在屏幕上时的状态。即你必须预测下一对绘制帧的输入并使用它。
卡尔曼滤波器已成为事实上的标准方法。