2016-08-23 3 views
0

Ich schreibe eine OpenGL-Anwendung in Linux mit Xlib und GLX. Ich möchte den Mauszeiger verwenden, um Objekte in dem Fenster zu zeichnen und zu ziehen. Aber egal, welche Methode ich zum Zeichnen oder Verschieben von Grafikobjekten verwende, es gibt immer eine merkliche Verzögerung zwischen der tatsächlichen Mauszeigerposition (wie vom X-Server gezeichnet) und den Positionen der Objekte, die ich mit den Zeigerkoordinaten erhalte Xlib (XQueryPointer oder die X-Ereignisse) oder direkt aus/dev/input/event lesen *XOrg Server-Code, der den Mauszeiger zeichnet

Also meine Frage ist: welcher Code wird vom XOrg-Server verwendet, um tatsächlich den Mauszeiger auf dem Bildschirm zu zeichnen? So könnte ich die gleiche Art von Code verwenden, um die Grafiken auf dem Bildschirm zu platzieren und den Mauszeiger und die Positionen der Grafikobjekte immer perfekt ausgerichtet zu haben.

Selbst ein Zeiger auf die relevante (n) Quelldatei (en) von XOrg wäre großartig.

Antwort

2

Meine Frage ist also: Welchen Code benutzt der XOrg-Server, um den Mauszeiger tatsächlich auf den Bildschirm zu zeichnen?

Wenn alles gut geht, wird überhaupt kein Code gezeichnet. Sogenannte "Hardware-Cursor" -Support gibt es seit Jahrzehnten. Im Wesentlichen ist es, was als eine "Sprite-Engine" in der Hardware bekannt ist, die ein kleines Bild und ein Paar Werte (x, y) nimmt, wo es auf dem Bildschirm erscheinen soll. Bei jedem Frame, den die Grafikhardware an die Anzeige sendet, wird das Cursorbild an der bestimmten Position überlagert.

Das Grafiksystem aktualisiert ständig die Positionswerte basierend auf den Bewegungen des Eingabegeräts.

Natürlich gibt es auch Grafikhardware, die diese Art von "Sprite Engine" nicht hat. Aber der Trick hier ist, oft zu aktualisieren, schnell zu aktualisieren und spät zu aktualisieren.

Aber egal, welche Methode ich zum Zeichnen oder Verschieben von Grafikobjekten verwende, es gibt immer eine merkliche Verzögerung zwischen der tatsächlichen Mauszeigerposition (wie vom X-Server gezeichnet) und den Positionen der Objekte, mit denen ich zeichne der Zeiger Koordinaten I von Xlib (XQueryPointer oder die X-Ereignisse) erhalten oder direkt von/dev/input/Event *

Ja, das lesen passiert, wenn man es bei integrieren sie in Ihr Bild zur falschen Zeit zu lesen. Der Hauptbestandteil zur Minimierung der Latenzzeit ist es, so spät wie möglich zu zeichnen und so lange wie möglich Input zu integrieren, bevor Sie absolut Dinge zeichnen müssen, um den V-Sync-Termin einzuhalten. Und der wichtigste Trick ist nicht, zu zeichnen, was in der Vergangenheit war, sondern zu zeichnen, was genau in dem Moment sein wird, in dem das Bild auf dem Bildschirm erscheint. I.e. Sie müssen die Eingabe für die nächsten paar gezogenen Frames vorhersagen und diese verwenden.

Der Kalman Filter ist die de-facto Standardmethode dafür geworden.

Verwandte Themen