Ist es dem Spieler normalerweise möglich, eine Taste innerhalb eines einzelnen Frames zu drücken und loszulassen, damit die Spiel-Engine keine Zeit hat, sie zu erkennen?
Wie gehen Programmierer normalerweise mit dieser Situation um? Ist es überhaupt notwendig, damit umzugehen?
Während des Tests konnte ich innerhalb von 14 oder 15 Millisekunden (über 1 Klick / Bild) eine Taste drücken und loslassen. Ich war jedoch nicht in der Lage, dies zu tun, während ich den Joystick normal hielt, und der Zyklus der Pressemitteilung musste fast genau zum Zeitpunkt des Frame-Starts beginnen.
Insbesondere frage ich nach den Joystick-Eingabefunktionen von GLFW.
Ich verwende derzeit GLFW, um ein Spiel zu erstellen, und ich habe festgestellt, dass Tastatur und Maus Rückruffunktionen haben, Joysticks jedoch nicht. Es scheint auch nicht möglich zu sein, "Sticky Keys" für einen Joystick zu aktivieren. (Ich habe erst vor kurzem angefangen, GLFW zu verwenden. Bitte korrigieren Sie mich, wenn ich falsch liege, da eines der beiden Probleme das Problem lösen würde.)
Obwohl ich nach GLFW frage, sind Antworten zu jeder Bibliothek / Engine / Sprache willkommen.
Bist du dir da sicher? Ich kann möglicherweise sehen, dass hier und da ein Zustandsübergang so schnell verläuft, aber Sie wissen, dass es anhaltende 70 Drücken pro Sekunde dauern würde, bis alle 14 ms ein Knopf gedrückt wird? Tut mir leid, aber das ist physikalisch nicht möglich, obwohl Sie es vielleicht hier und da mit ein paar verrückten Knopfdrücken auslösen können, und vielleicht gibt es sogar einen Sprung in der Hardware selbst. Haben Sie jemals ein Video von professionellen StarCraft-Spielern gesehen, in dem sie alle Finger einer Hand sowie eine Maus verwenden und so schnell klicken, dass es unscharf wird? Diese Jungs sind Götter, wenn sie 300 Aktionen pro Minute ausführen können, was 5 pro Sekunde mit beiden Händen entspricht ...
Das heißt, im Allgemeinen wird bei vielen Spielen nur die Eingabe jedes Frames abgefragt. Die Möglichkeit, dass eine ganze Pressemitteilung innerhalb eines Frames stattfindet und verloren geht, ist bei interaktiven Frameraten ziemlich gering, und ich habe noch nie einen Spieleentwickler gekannt, der sich darüber Sorgen macht.
Auf einigen Systemen erhalten Sie möglicherweise gepufferte Eingaben. Das System überwacht die Eingabegeräte asynchron und füllt eine Warteschlange mit allen Statusänderungen, die seit der letzten Abfrage stattgefunden haben. Im Allgemeinen lassen Sie den Puffer zwischen den Frames füllen und verarbeiten ihn für jeden Frame, sodass die Auflösung möglicherweise höher ist als die Abfrage der Zustand jedes Rahmens.
Einige Systeme sind ereignisgesteuert, sodass Sie einen Rückruf registrieren können, der bei jeder Änderung des Eingabestatus ausgelöst wird. Die Auflösung hängt jedoch vom Rest des Software-Stacks ab und ist möglicherweise erheblich besser als eine Überprüfung pro Frame. Wenn die API beispielsweise nur die Hardware jedes Frames abfragt, sie mit dem letzten Frame vergleicht und dann die entsprechenden Rückrufe auslöst, geht es Ihnen nicht besser.
Mit eingebetteten Systemen und einigen alten Spielsystemen, die auf das Metall programmiert waren, hätten Sie Interrupts für die Tasten gehabt. Ein Interrupt ist ein kleiner Code, den Sie beim System registrieren, der jedes Mal ausgeführt wird, wenn etwas passiert. Im Falle eines Tastenunterbrechens würde die Hardware physikalisch so ausgelegt sein, dass, wenn die Spannung an dem mit der Taste verbundenen Kabel von niedrig nach hoch oder hoch nach niedrig geht, dieses Codebit ausgeführt wird. Dies wäre das direkteste und reaktionsschnellste System, aber die meisten Spiele haben heutzutage eine Menge Hardware und Software zwischen Ihnen und den Tasten.
quelle
Unter der Annahme, dass ein Spiel mit 60 fps läuft, beträgt jeder Frame etwa 17 Millisekunden. Es ist höchst unwahrscheinlich, dass jemand in dieser Zeit drücken und veröffentlichen kann. Wenn Sie schnell genug klicken können, um ungefähr 60 Klicks pro Sekunde zu erhalten , müssen Sie schnell genug drücken und loslassen, um die Frames zu schlagen.
quelle