Geh zur Artikelliste
06.08.20Entwickler

Status der Treffererkennung

Teilen:

Hi, ich bin Kevin Lee, Softwareentwickler im Game Systems-Team von VALORANT. Unser Team ist für Entwicklung zahlreicher Kernsysteme wie Bewegung, Kampf und Eingabe verantwortlich, die das Gameplay von VALORANT bilden. In diesem Beitrag werde ich eins der Systeme besprechen, die für das FPS-Gameplay unabdingbar sind: die Treffererkennung.

In einem Spiel wie VALORANT gehört die Treffererkennung sicherlich zu den wichtigsten Systemen, weil der Unterschied zwischen Sieg oder Niederlage von einem einzigen Kopfschuss abhängen kann. Wir als Entwickler möchten gewährleisten, dass ein vom Spieler abgefeuerter Schuss ein eindeutiges Ergebnis hat, sich „richtig“ anfühlt und, was am wichtigsten ist, korrekt verläuft.

Manchmal lesen wir Beiträge oder erhalten Nachrichten von Spielern, die uns Videos schicken, in denen ihrer Meinung nach gegen die Trefferregeln verstoßen wird. Wir nehmen all diese Berichte ernst und schauen uns diese Clips Bild für Bild an, um zu prüfen, ob das System wie erwartet läuft.

Allerdings sind wir der Meinung, dass die Treffererkennung in VALORANT momentan ziemlich gut funktioniert. Natürlich können ab und an noch Fehler in Grenzfällen auftreten, die wir ebenfalls ernst nehmen. Wir sind ständig bemüht, die Qualität und Eindeutigkeit aller unserer Systeme zu verbessern.

RICHTIGKEIT UND EINDEUTIGKEIT

Im Beta-Patch 0.50 haben wir wesentlich mehr Meldungen zu Problemen mit der Treffererkennung erhalten als sonst. Nach der Durchsicht der Berichte und Videos unserer Spieler und der Durchführung erweiterter interner Testläufe gelang es uns, mehrere Grenzfälle Treffererkennungsfehlern zu identifizieren, doch keiner davon war schwerwiegend genug, dass er die gestiegene Anzahl der Meldungen hätte erklären können. Beim genaueren Hinschauen stellten wir allerdings fest, dass die Mehrheit der Clips keine Probleme bei der Richtigkeit, sondern bei der Eindeutigkeit hatten. Die Schüsse wurden korrekt verarbeitet, doch ihre grafische Darstellung sorgte für Ergebnisse, die falsche Schlüsse zuließen. Damit möchten wir auf den wichtigen Unterschied zwischen Richtigkeit und Eindeutigkeit hinweisen.

Beide sind wichtig für den Eindruck, den man bei einem Schuss hat, aber ...

  • Richtigkeit bezieht sich auf das Ergebnis einer Fehlleitung. Beispiel: Die Kugeln treffen den Kopf, werden aber am Körper erfasst, oder gegnerische Spieler werden auf dem Client anders als auf dem Server dargestellt.
  • Eindeutigkeit bezieht sich darauf, wie schwierig die Interpretation eines Schusses ist. Beispiel: Die Kugel hat die Schulter des Gegners getroffen, doch durch ihre grafische Darstellung scheint es so, als habe sie dessen Kopf erwischt.
  • Abweichungen bei der Richtigkeit sind schlimmer als fehlende Eindeutigkeit

Wir hoffen, dass wir das System in diesem Artikel so erklären, dass alle Spieler anschließend nachvollziehen können, was mit ihren Schüssen auf dem Bildschirm passiert. Dazu lege ich dar, wie das System auf den höheren Ebenen funktioniert, und erläutere, was zwischen dem Drücken der Feuer-Taste bis hin zur Anzeige des Kopfschusses passiert.

Wer sich über die technischen Details dahinter informieren möchte, erfährt in diesem Artikel über den Netcode von VALORANT im Riot Tech Blog mehr.

Außerdem präsentiere ich allgemeine Fälle, in denen die Treffererkennung nicht zu funktionieren scheint, und versuche zu erklären, was dahinter steckt, und was wir unternehmen, um die Eindeutigkeit in diesen Szenarien zu verbessern.

VOM KLICKEN BIS ZUM KOPFSCHUSS

Bevor wir uns ansehen, was passiert, wenn man einen Schuss abfeuert, müssen wir verstehen, wie das Spiel das Geschehen simuliert. Das Gameplay von VALORANT wird zweimal simuliert: zum einen auf dem Server, der als Instanz festlegt, wie die Simulation abläuft, und zum anderen auf deinem Client, der die Serverergebnisse vorausberechnet, damit sich das Spiel reaktionsschneller anfühlt.

Die Spielsimulation umfasst alles, was die Welt ausmacht: die Spielerpositionen, durch die Luft fliegende Fähigkeiten und den Rauch auf dem Schlachtfeld. Das Spiel erfasst bei jedem Einzelbild eine Momentaufnahme der Simulation und verwendet sie, um dieses Einzelbild auf deinem Monitor darzustellen. Der Server macht das Gleiche auf seiner Seite, überspringt aber das Rendern, weil dort niemand zusieht.

Wenn also ein Gegner um eine Ecke lugt, und du in weiser Voraussicht schon das Fadenkreuz dort platziert und seinen Kopf anvisiert hast, was passiert dann, sobald du die linke Maustaste drückst, um zu schießen?

hit_reg_flow.jpg

Sobald du eine Taste oder einen Knopf drückst, wird diese Eingabe unter Berücksichtigung einer Verzögerung (Latenz), die von der verwendeten Hardware bzw. dem Betriebssystem abhängt, an das System weitergeleitet. Pro Einzelbild bearbeitet das System alle seit dem vorherigen Frame von ihm empfangenen Eingaben. Wenn du schießt, wird dieser Feuerbefehl mit einem Zeitstempel an den Server gesendet, der festhält, in welchem Einzelbild der Simulation der Schuss erfolgt ist.

Wichtig: Dieser Zeitstempel bezieht sich darauf, was in dem Augenblick, in dem die Eingabe bei VALORANT eingeht, auf deinem Bildschirm dargestellt wird. Wir müssen dem Schuss nun in zwei verschiedenen Simulationen folgen: in der des Servers und in der des Clients.

Beginnen wir mit dem Client – das ist dein lokaler Computer. Sobald der Schuss dem Server gemeldet worden ist, beginnt der Client damit, die Anzeige des Mündungsfeuers der Waffe und der Leuchtspur der Patrone zu berechnen. Das geschieht frühestens ein Einzelbild nach dem Abschluss deiner Eingabe, da das Spiel ein neues Bild rendern muss. Das ist wichtig, weil es bedeutet, dass das Bild, in dem der Schuss verarbeitet wird, NICHT das selbe ist, in dem die Leuchtspur angezeigt wird. Tatsächlich findet das mindestens ein Einzelbild davor statt.

Das führt manchmal dazu, dass ein Schuss nicht eindeutig ist. Normalerweise wird die Kugel verzögert, um diesen Synchronisationsfehler zu beheben. Wir machen das nicht, weil die Verzögerung der Kugel zu einer Eingabelatenz führen wurde, die wir in VALORANT minimieren möchten. Bevor der Client eine Trefferbestätigung darstellt, wartet er die Antwort des Servers mit dem Ergebnis ab. Damit diese Ergebnisse bei allen Nutzern konsistent bleiben und Betrüger ihre Clients nicht hacken können, um gefälschte Trefferresultate zu liefern, werden Schussergebnisse ausschließlich vom Server festgelegt.

Unterdessen empfängt der Server die Meldung, dass ein Schuss abgefeuert wurde. Aufgrund der Latenz im Internet ist Zeit vergangen, seitdem der Nutzer geschossen hat. Damit der Schuss auch in der Simulation abgefeuert wird, die der Spieler vor sich sieht, dreht der Server die Simulation zu dem Zeitstempel zurück, der ihm vom Client vor der Auswertung der Treffererkennung übermittelt wurde. Die Positionen und Animationsposen der Spieler werden dabei ebenfalls „zurückgespult“. Der Server sendet dann das Ergebnis des Schusses an den Client. In unserem Beispiel könnte das ein Kopfschuss gewesen sein.

Der Client erhält dann eine Nachricht vom Server, die ihn über das Ergebnis des Schusses informiert, und spielt die passenden Grafik- und Soundeffekte ab. In diesem Fall wären das die für Kopfschüsse. Da der Client warten muss, bis der Server ihm das Ergebnis mitteilt, tritt eine Verzögerung zwischen der Leuchtspur und den Treffereffekten auf, die der Umlaufzeit deiner Verbindung (d. h. 40 ms zum Server = 80 ms Verzögerung zwischen Leuchtspur und Grafikeffekten) zuzüglich eines kleinen Zuschlags für deren Berechnung entspricht. Bei höheren Latenzzeiten kann sich diese Verzögerung in Echtzeit bemerkbar machen.

An diesem Problem arbeiten wir aktiv, um diese Eindeutigkeit zu verbessern.

FALLSTUDIE 1: Treffer auf sich bewegende Ziele

Case_Study_1.gif

In zahlreichen Meldungen zu Treffererkennung ist uns aufgefallen, dass das jeweilige Ziel rannte. Schauen wir uns an, was grafisch passiert, wenn ein Schuss ein laufendes Ziel erwischt. Wir sehen, dass der feuernde Spieler dem rennenden Ziel erfolgreich einen Kopfschuss verpasst. Um das Problem in diesem Beispiel besser zu verdeutlichen, stellen wir uns vor, dass der Client mit 60 FPS ausgeführt wird. Man sieht, dass das Fadenkreuz in dem Einzelbild vor dem Schuss und der dazugehörigen Leuchtspur auf dem Kopf des Gegners liegt.

case-study-1_frame-1.jpgcase-study-1_frame-2.jpg

Aber in dem Einzelbild, auf dem die Leuchtspur dann erscheint, ist das nicht mehr der Fall.

case_study_1_part_2.gif

Im zweiten Clip sehen wir dasselbe Szenario, doch hier verfehlt der Schuss sein Ziel knapp. Schaut man sich das Video Bild für Bild an, merkt man, dass es sich umgekehrt verhält: Auf dem Einzelbild vor dem Erscheinen der Leuchtspur ist das Fadenkreuz nicht auf dem Kopf. Auf dem Einzelbild, in dem sie aus der Waffe kommt, aber schon. Auf den ersten Blick könnte man glauben, dass dieses Einzelbild mit der Leuchtspur ganz klar einen Kopfschuss darstellt. Beim Prüfen von Videos oder Wiederholungen müssen wir uns jedoch stattdessen den Frame vor der Leuchtspur ansehen, damit wir eine genaue Vorstellung davon bekommen, wann der Schuss abgefeuert wurde.

case-study-1_part2_frame-1.jpgcase-study-1_part2_frame-2.jpg
case-study-1_part2_no-hit-vfx.jpg

Wenden wir uns wieder dem Beispiel zu, in dem der Schuss traf, und sehen wir uns das Einzelbild an, auf dem die Treffereffekte gerendert wurden. Zwischen der aktuellen Position des Spielers und der Position der Treffereffekte fällt uns eine Lücke auf, die durch die Internetlatenz entsteht. Das kann verwirren, wenn man zu verstehen versucht, was mit dem Schuss passiert ist – weil man sich wahrscheinlich auf die aktuelle Position des Gegners konzentriert, und nicht auf dessen Position zum Zeitpunkt des Schusses. Noch mehr Verwirrung kann auftreten, wenn man in der Hocke sitzt oder aus der Bewegung schießt. Das schauen wir uns in der Fallstudie 2 an.

case-study-1_part2_frame-where-hit-vfx-rendered.jpg

Diese Fallstudie veranschaulicht einen Mangel an Eindeutigkeit im aktuellen System für die Treffererkennung. Im Idealfall brauchst du diese ganzen Hintergrundinformationen nicht zu verstehen, um die Situation zu erfassen. Das ist uns als Entwicklern klar. Deswegen suchen wir nach Wegen, um die Eindeutigkeit in diesen Fällen zu verbessern.

FALLSTUDIE 2: In die Schuss-Grafik hocken

Du hast ein Feuergefecht aus der Entfernung eingeleitet. Noch bereust du es nicht, aber jetzt hältst du erst einmal die linke Maustaste gedrückt und ballerst durch die Gegend. Mindestens eine dieser Kugeln wird ja wohl ein Kopfschuss sein, oder? Aber nein, du landest mit deiner Vandal 3 Körpertreffer, verursachst 117 Schaden und erhältst selbst einen Kopfschuss.

Du bist sauer, schaust dir nach dem Spiel die Aufzeichnung an und bist sicher, dass hier ein Treffer nicht richtig erfasst wurde. Du siehst, dass dein Gegner die ganze Zeit nach links und rechts gezuckt ist (Crouch-Spamming), um deinen Schüssen auszuweichen. Du bist ganz überrascht, als du einen Treffer mitten in seinem Gesicht bemerkst, der ihn in der Hocke erwischt. In deinem Kampfbericht ist aber nur von Körpertreffern die Rede! Wie bitte??

Hier ist ein Link zu einem echten Post auf Reddit mit dem Titel Headshots not registering when a player crouches (Kopfschüsse werden nicht erkannt, wenn das Ziel in der Hocke ist), der zu unserer hypothetischen Geschichte passt.

Wenn unser Team Berichten über eine mangelhafte Treffererkennung nachgeht, steckt meistens etwas Ähnliches dahinter. Die Treffererkennung funktioniert allerdings, denn deine Schüsse fliegen dorthin, wohin du zielst (von Streuungs- oder Bewegungsfehlern mal abgesehen), wenn du die Feuertaste drückst, und sie werden korrekt auf dem Server erfasst.

Es gibt jedoch ein paar Faktoren, die einen in diesem Fall grafisch in die Irre führen:

  1. – Treffereffekte sind aufgrund der Internetlatenz verzögert
  2. – Treffereffekte werden an der ursprünglichen Einschlagposition angezeigt
  3. – der Spieler bewegt sich (sehr oft in der Hocke)

Case_Study_2.gif

Nehmen wir in einem weiteren Beispiel an, dass der Spieler einen Ping von 50 hat. Der Spieler erwischt seinen Gegner an der Schulter. Wir müssen aber warten, bis der Server den Treffer bestätigt. Deswegen vergehen 100 ms, bis die Grafikeffekte an der Position des Körpertreffers angezeigt werden. Während dieser 100 ms ist der Gegner jedoch in die Hocke gegangen und hat seinen Kopf direkt hinter den neu hinzugefügten Effekt bewegt. In der Hitze eines Feuergefechts und auf große Entfernungen kann der Grafikeffekt eines Körpertreffers leicht mit dem eines Kopfschusses verwechselt werden.

case-study-2_cursor-on-body.jpgcase-study-2_hit-VFX-on-body-correctly.jpgcase-study-2_player-crouches-into-vfx.jpg

Besonders schlimm war das im Beta-Patch 0.50, als die Darstellung von Blut versehentlich bei allen Spielern deaktiviert wurde, denn bei unseren Funkeneffekten lässt sich grafisch nicht so eindeutig zwischen Kopfschüssen und Körpertreffern unterscheiden. Wir haben schon immer voneinander getrennte Grafikeffekte für Körpertreffer und Kopfschüsse gehabt, es ist uns aber nie aufgefallen, dass sie im Kampf nicht immer eindeutig waren.

Dieses Problem mit der Eindeutigkeit der Treffererkennung versuchen wir aktiv zu beheben. Wir experimentieren unter anderem damit, Grafikeffekte mit Treffern auf die jeweiligen Körperteile zu verknüpfen, um auch bei einer hohen Latenz keine Unklarheiten aufkommen zu lassen.

Vergleich unserer aktuellen Kopfschuss-Treffereffekte ohne Blut mit Körpertreffer-Effekten:

headshot-VFX.jpgbody-shot-VFX.jpg

GEPLANTE VERBESSERUNGEN DER EINDEUTIGKEIT

Die beiden Fallstudien verdeutlichen, in welchen Bereichen unsere Grafikeffekte zur Trefferbestätigung momentan noch Mängel aufweisen. Eine der Änderungen, die wir angesprochen haben, ist das Darstellen von Blut- und Funkeneffekten an der aktuellen Position einer Spielfigur, und zwar in Abhängigkeit davon, welcher Körperteil getroffen wird. Diese Effekte sollen ihr außerdem folgen, wenn sie sich bewegt. Damit verbessern wir die Eindeutigkeit in Situationen mit hockenden Gegnern wie der aus der Fallstudie 2, da der Grafikeffekt deren Körperbewegungen begleitet.

Dieser Ansatz hat jedoch einen Nachteil: Es wäre möglich, die Effekte einer Trefferbestätigung zusammen mit der dazugehörigen Spielfigur hinter eine Deckung zu bewegen. Man stelle sich einen Spieler mit einem Ping von 100 ms vor, der an einer Ecke hin- und herwackelt (Jiggle Peeking) und auf einen Gegner schießt. Wenn dieser Schütze einen Treffer landet und sich sofort wieder hinter die Ecke begibt, bevor die Bestätigung vom Server eintrifft, wird er die Trefferbestätigung nicht sehen können, sobald sie angezeigt wird.

Wir denken darüber nach, mehrere Partikel hinzuzufügen, von denen einige der Figur folgen, und andere nach der Vorgabe aus der Client-Simulation sofort an der Trefferposition angezeigt werden sollen, um dieses Problem zu lösen. Das kann allerdings auch Verwirrungen führen, wenn Client und Server sich über das Ergebnis eines Schusses nicht einig sind: Die Effekte müssen eindeutig dargestellt werden, damit man dieses Ergebnis sofort begreift.

Wir arbeiten weiterhin an dieser und anderen Verbesserungen der Eindeutigkeit und hoffen, dass wir dazu in einem zukünftigen Patch schon bald etwas Neues vermelden können.

SCHICKT WEITER VIDEOS

Hoffentlich hat dir dieser Beitrag dabei geholfen, die Mechanismen hinter der Treffererkennung in VALORANT und die Ergebnisse des Schusswaffeneinsatzes darin besser zu verstehen. Schicke uns bitte weiterhin jederzeit gerne Videos, wenn du glaubst, dass die Treffererkennung bei dir nicht funktioniert. Wir versuchen wirklich, sie uns alle anzusehen.

Auch wenn es darin kein konkretes Problem gibt, können wir Fehler bei der Treffererkennung so schneller erfassen, wenn sie tatsächlich auftreten sollten (übrigens geht mein Puls immer dann hoch, wenn ich den Begriff „Hit Reg“ (Treffererkennung) im Betreff eines hoch bewerteten Posts auf Reddit lese).

Hier ist ein Beispiel für einen Fehler bei der Richtigkeit der Treffererkennung auf Reddit.

0