Erkennen Sie extrem schnelle Joystick-Tastendrücke?

7

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.

Äpfel
quelle

Antworten:

7

Auf Nintendo- und Sony-Hardware haben wir die Eingabe manchmal mit einer höheren Rate abgefragt, als wir Frames gezeichnet haben. Verwenden Sie einen zeitgesteuerten Thread, um die Controller-E / A beispielsweise bei 120 Hz zu betrachten, selbst wenn wir bei 30 Hz gerendert haben. Mit "einem zeitgesteuerten Thread" meine ich, dass es einen Hardware-Timer gab, der einen Interrupt auslöste, der dazu führte, dass eine bestimmte Funktion in Echtzeit aufgerufen wurde. Auf diesem System wurde der Controller als speicherabgebildete E / A angezeigt, sodass Sie einfach ein Wort aus einem bestimmten Speicherort laden und in diesem Moment die Position der X-Achse des Joysticks haben würden. Sie würden das irgendwo im Hauptspeicher speichern, und wenn Ihre Hauptspielschleife ausgeführt würde, würde sie einen Verlauf von 4 oder 8 oder wie viele Abtastdaten von Eingabedaten in einem konsistenten Zeitintervall haben.

Dies diente nicht dazu, das Drücken von Knöpfen zu erkennen, sondern um ein klares Intraframe-Timing für Kampfspiele zu erzielen, bei denen es darauf ankam (weil Sie Eingaben "vor" einem kritischen Trigger-Frame in der Animation in die Warteschlange stellen durften und die Animationsrate möglicherweise nicht so war stabil, wie wir möchten, also mussten wir unterscheiden, ob Sie die Schaltfläche vor der Rahmengrenze oder darauf drücken würden).

Ich weiß nicht, ob es mit GFWL möglich ist. Das Eingabesystem von DirectX ist ziemlich eng an den Renderzyklus gebunden, und zwischen Ihnen und den Switches im USB-Gamepad gibt es eine Menge Betriebssysteme.

Crashworks
quelle
Dies ist die beste Lösung, die ich bisher gesehen habe. Soweit ich weiß, ist die Joystick-Eingabe, zumindest unter Windows, in keiner Weise an das Render-System gebunden. Standardmäßig frage ich die Eingabe einmal pro Frame ab (wenn ich Puffer austausche), aber es ist sicherlich möglich, diese in einen Thread zu verschieben.
Äpfel
2

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.

Suboptimus
quelle
1
Ich stimme dem zu, was Sie sagen, aber in dieser Situation spielt die durchschnittliche Anzahl der Druckvorgänge pro Sekunde weniger eine Rolle als die Geschwindigkeit, mit der ein einzelnes Tippen dauert. In meinen Tests betrug meine durchschnittliche Tippzeit (gemessen an der Zeit, in der sich die Taste im Zustand "unten" befand) etwa 50 ms. Dies bedeutet jedoch nicht, dass ich die Taste 20 Mal pro Sekunde gedrückt habe, da die durchschnittliche Zeit, in der sich die Taste im "freigegebenen" Zustand befand, etwa 150 ms betrug. Dies zeigt, dass es viel einfacher ist, eine Taste in einem Frame zu drücken und loszulassen, als durchschnittlich 60 Taps pro Sekunde zu halten.
Äpfel
OK, ich verstehe. Das ist sinnvoll, ähnlich wie Crashworks bei Kampfspielen, bei denen ein hochauflösendes Timing von Ereignissen wichtig ist. Ich verstehe definitiv, wie dies ein Problem für Sie sein könnte, wahrscheinlich möchten Sie asynchrone Eingangsabtastung durchführen, wie er vorgeschlagen hat.
Suboptimus
0

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.

MichaelHouse
quelle
Dies ist wahr, aber ich kann immer noch einige Randfälle sehen, in denen es passieren kann. Vielleicht ist es am besten, sich darüber keine Sorgen zu machen, da ein Benutzer, der eine Taste drückt, dies wahrscheinlich schnell versehentlich tut oder ein Betrugswerkzeug verwendet. Trotzdem suche ich immer noch nach einer Lösung für das Problem.
Äpfel
Kein professionelles Spiel tut etwas Besonderes, um damit umzugehen, und man hört keine Leute, die sich beschweren. Menschen können nicht so schnell Knöpfe drücken.
Sean Middleditch
2
@DBRalir Wenn Sie Eingaben abfragen, gibt es keine Möglichkeit, dies zu erkennen, da dies für Ihr Programm nicht geschehen ist. Es gibt wichtigere Dinge, über die man sich Sorgen machen muss als über diesen außergewöhnlich seltenen Randfall.
MichaelHouse
@ Byte56 Ja, ich ignoriere es. Ich kann regelmäßig Abgriffzeiten unter 15 ms erhalten, aber das wird sich normalerweise mit der Abfrageroutine überschneiden. Damit das Programm den Abgriff vollständig verfehlt, müsste es ungefähr 7 ms dauern, was nicht möglich erscheint. Danke für deine Antwort.
Äpfel
Gut zu hören. Klingt so, als würde dein Spiel schnell gehen! Das wird Spaß machen. Viel Glück damit :)
MichaelHouse