# Zeitkritisches auslesen von Tastatureingaben



## Mariusla (8. Mrz 2011)

Hallo!

Für einen psychologischen Test (vgl. auch mein Posting zu BufferedImages) will ich Tastatureingaben möglichst in Echtzeit erfassen. Mir ist klar dass durch die Hardware und die ganzen Schichten dazwischen (USB-Treiber ect.) Latenzen entstehen, die weder ich noch Java beeinflussen können. 

Mir geht es darum, die Latenz die in der JVM entsteht, möglichst gering zu halten. In allen Büchern, auch in denen über Spieleprogrammierung, wird einfach ein KeyListener an eine Swing-Komponente gebunden. Aber wenn ich das richtig verstehe ist es dann ein bisschen Glückssache (bzw. zusatandsabhängig) wie schnell der event dispatch thread reagiert. 

Ist diese Befürchtung begründet; und wenn ja, kennt jemand eine bessere Lösung? Mit den ca. 20 ms Latenz durch USB kann ich leben, aber wenn dann nochmal eine unsystematische Streuung im zweistelligen ms-Bereich durch Java dazukommt wird es langsam schwierig.

Viele Grüße, Marius


----------



## Runtime (8. Mrz 2011)

Ich glaube kaum, dass dafür 20ms gebraucht werden, wohl eher nicht. Wenn du es trotzdem ohne die Javaverarbeitungszeit machen willst, dann musst du das mit C/C++ & JNI erledigen.


----------



## Mariusla (17. Mrz 2011)

Hallo!

Die 20 ms habe ich mal in einem Technikforum aufgeschnappt, in dem sich Freaks über die Latenzen von über USB verbundenen Geräten ausgetauscht haben. Drum wollte ich zumindest JVM-Latenzen eliminieren. Ich versuch's mal mit JNI, das hätte ja noch den schönen Vorteil dass der KeyLIstener nicht auf den Fokus der Swing-Komponente angewiesen ist.

Vielen Dank, viele Grüße, Marius


----------



## muckelzwerg (17. Mrz 2011)

Ich will nicht den Spielverderber geben, aber ... mach doch erstmal eine Messung. 
Es ist zwar gängig, dass man pauschal irgendwelche Verluste wegoptimieren will, ohne überhaupt jemals zu schauen, ob diese Verluste relevant sind, bzw. überhaupt existieren, aber gut ist das deshalb noch lange nicht.

20ms Verzögerung? Das ist schon einiges. Bist Du da sicher? Willst Du das einfach so glauben? Kannst Du es prüfen? Wenn nicht, wie willst Du dann rausbekommen, ob Deine Optimierungen was bringen? 
Und warum ist die Verzögerung überhaupt interessant? Du willst doch damit nicht auf die Uhr schauen, sondern Reaktionszeiten messen. Brauchst Du dafür eine gerine Verzögerung oder vielleicht doch eher eine bekannte und möglichst konstante Verzögerung?


----------



## SlaterB (17. Mrz 2011)

von wo bis wo soll denn gemessen werden, ab einer bestimmten vorherigen Darstellung auf dem Monitor?
wenn man da auch noch irgendwelche Verzögerungen für möglich hält, sei es durch Arbeit an sich, sei es durch Warten aus diversen Gründen (allein Unterbrechung durchs Betriebssystem)..

dann gibt ja noch das Problem, dass zumindest in Java mit dem verbreiteten System.currentTimeMillis() eh nur auf ca. 20 ms genau gemessen werden kann, 
System.nanoTime() mag hier helfen

also ich sehe da schwarz, gerade in Java mit seinem Sandkasten-Ansatz 
'niemand weiß was genau der Untergrund macht, aber innerhalb der gesetzen Grenzen läuft alles korrekt ab'

wenn das überhaupt ohne spezielle Hardware umzusetzen ist, dann sicher besser in einer direkteren Sprache


----------



## muckelzwerg (18. Mrz 2011)

Das kann auch in Java gut funktionieren. Eine Verzögerung gibt es doch immer. Aber man will vielleicht eher nicht eine Uhrzeit aufschreiben, die "ungefähr" angibt, wann das Bild zu sehen war und eine weitere, "ungefähr" wann die Reaktion kommt usw.
Wenn es zum Beispiel darum geht, die Reaktionszeiten zwischen verschiedenen Testvarianten zu vergleichen, dann sind die absoluten Zahlen vielleicht gar nicht relevant.
Da stellt sich dann nur die Frage "wieviel schnell/langsamer lief es bei Test X,Y,Z?".
Für solche Messungen ist die Dauer der Verzögerung gar nicht relevant.
Gerade bei der Psychologie geht es vielleicht viel mehr um Vergleiche, als um die eher medizinische Frage nach der absoluten Verzögerung.

Für den Fall, dass man tatsächlch die genauen Reaktionszeiten messen will, wäre es nochmal viel wichtiger die Verzögerungen zu kennen und sie möglichst konstant zu halten. Da könnte man das System auch einmal sauber durchmessen und kalibrieren. Danach rechnet man die x ms jedesmal raus. Wieviel ms die dann beträgt ist doch irrelevant. Und das macht es in einer anderen Sprache auch kein bisschen leichter. Da muss man genauso messen und rausrechnen. Man kann ja nicht einfach sagen "Ach egal, die Verzögerung ist null, weil das ist ja C." Dann ist sie halt kleiner, das ändert aber doch an keinem Schritt der Kette etwas.


----------



## HoaX (18. Mrz 2011)

Muss es die Tastatur sein oder gehen auch andere externe Eingabegeräte?
Je nach Anwendungsfall ist es ggf einfacher eine spezielle Hardware zu verwenden die dann noch einen Timestamp mitschickt, so kann man dann zumindest zwischen zwei Eingaben die Zeit sehr genau bestimmen.


----------

