Eingabe verarbeiten ohne Rendering zu blockieren

trench140

Mitglied
Hallo allerseits,

ich habe hier ein (wissenschaftliches) Programm, welches seine grafische Ausgabe per OpenGL realisiert. Eingaben können per Maus und Tastatur erfolgen und werden in grafische Ausgaben umgesetzt. Der Programmablauf ist dabei wie folgt (vereinfacht):

Code:
while(1) {
    while(getInputEvents()) {
        code = getInputEvent(&event);
        if(code == 0) {
            switch(val) {
                case EVENT_MOUSE_MOVE:
                ...
            }
        }
    }
}

Das Problem ist dabei die doppelte while-Schleife. Die Innere wird benötigt, damit kein Event verloren geht. So ist es z.B. wichtig bei Mausbewegungen jeden Punkt aufzuzeichnen, dies funktioniert nicht, wenn die innere Schleife einfach in die äußere Schleife transformiert wird, da pro Sekunde mehr Events erzeugt werden können, als FPS dargestellt werden. Dadurch würden nicht mehr alle Events abgearbeitet werden können, was schließlich dazu führt, dass die grafische Darstellung verfälscht wird bzw. der Eingabe extrem hinterherhängt.

Ich würde daher gerne wissen, wie man in diesem Fall die Eingabe von der Darstellung entkoppeln kann, so dass beides flüssig arbeiten kann. Die Entwicklung geschieht unter Linux.

Gruß,
Trench
 
Hi Trench

Na ja, wenn du mehr Eingabeevents pro Sekunde hast als Frames gerendert werden wirst du nie eine Möglichkeit haben alle genau in dem Frame zu rendern, in dem sie aufgetreten sind.

Zum Thema blockieren bieten sich folgende Möglichkeiten:
1. Input wird in einem separaten Thread abgefragt
2. Du implementierst getInputEvents so, dass es sofort zurückkehrt, wenn kein Inputevent vorhanden ist gerade im Moment des Aufrufs und verarbeitest immer so lange Events bis getInputEvents zurückgibt, dass keine Events mehr vorhanden sind und renderst dann ein Frame. Je nach Komplexität der Eingabeverarbeitung und der Menge an Eingabeevents (hier sollte man über eine Limitierung nachdenken) drosselt das natürlich die Framerate.
 
Hallo,

danke für deine Antwort. Wollte gestern noch einen Reply schreiben aber wurde dann unterbrochen und hab es vergessen.

Ich habe es nun, wie vorgeschlagen, mit einem Thread für die Eingabe realisiert, da ich auf die Sourcen von "getInputEvents" bzw. allgemein der API keinen Zugriff habe.

Gruß,
Trench
 
Zurück