saxxon.de hat geschrieben:
Lies das nochmal genau. Es ist nämlich richtig. Ich gebe dir einen Tipp: Wie wichtig ist Fairness wohl in
so einem Moment? Und nur falls du das Spiel nicht kennst: Ken blockt da jeden einzelnen Angriff von Chun-Li separat, weil er sonst Chipping Damage bekäme und den Kampf verlieren würde. Mach das mal mit Framedrops.
Hab ich doch geschrieben, dass die Framerate der Fairness halber TROTZDEM wichtig ist. Da aber die Aktionen an die Framerate gekoppelt sind, hast du hier gleich zwei Probleme: Nämlich weniger Frames UND ein komplett anderes Timing.
Ist Framerate und Timing entkoppelt, kann ich, wenn ich das Timing intus habe, trotzdem richtig getimed Aktionen auslösen, auch wenn z.B. ein Framedrop kommt. Ich muss das ja nicht sehen, ich kann aber trotzdem Tasten drücken. Wenn sich das Timing urplötzlich wegen einem Framedrop ändert, habe ich aber keine Chance mehr.
Die genannte Lösung ist also wirklich besser, auch wenn Framedrops immernoch nachteilig sind.
Desweiteren kann man die Framelösung anwenden, wenn 2 Spieler an einem Bildschirm spielen. Dann haben beide die gleiche Framezahl und das gleiche (wenn auch mit der Framerate sich verändernde) Timing.
Heute spielt man aber häufig nichtmehr an einem Monitorm, sondern im Netzwerk oder über Internet. Wenn jetzt das Spiel bei mir mit 40fps läuft und bei dir mit 50fps, welches Timing zählt denn dann? Meines mit 40 oder deines mit 50? Oder abwechselnd? Mit 40fps habe ich zwar so oder so einen Nachteil gegen dich mit 50fps, aber das Timing wäre dann unabhängig von meiner oder deiner Framerate mit 60Hz immer exakt gleich und kann auch konstant gehalten werden und verändert sich während des ganzen Spiels nicht.
saxxon.de hat geschrieben:Und mal eine Frage in den Raum gestellt: Wenn die Engine wie von dir beschrieben funktionieren würde und meine Framerate wäre niedriger als die meines Gegners; sagen wir 30 vs. 60 fps - dann wäre mein Gegner wie schon richtig von dir festgestellt in der Lage, die Animationen meiner Moves früher zu erkennen und zu reagieren - was bedeutet das für die Zeit, die ich habe auf die gegnerischen Aktionen zu reagieren?
Jap, kann er und zwar ganze 16 Millisekunden früher, im Beispiel 30 gegen 60fps. Wäre es an die Framerate gekoppelt, kann der Gegner deine Bewegung nicht früher erkennen, weil du fängst dann gar nicht erst an dich zu bewegen, sondern erst 16ms später. Und auch hier wieder die Frage: Welches Timing zählt denn nun? 30 oder 60?
Das geht kaputt wenn du Framedrops hast, das Spiel aber stur im Hintergrund mit normaler Geschwindigkeit weiterläuft.
Nein, tut es nicht. In dem Zitat ist auch kein einzelnes Wort zur Framerate, sondern es geht um die Reaktionszeit.
Machen wir eine kleine Zeitleiste.
Code: Alles auswählen
Spieler A
----------+----------+----------+----------+
^ ^ ^
A D G
Spieler B
--------+--------+--------+--------+--------+
^ ^ ^
C E H
Game Ticks
---+---+---+---+---+---+---+---+---+---+---+
^ ^
B F
Die + sind jeweils die Frames, bzw die Ticks die bei einer entkoppelten Spielweise laufen würden.
Zeitpunkt
A: Spieler drückt den Button für einen Punch, der 3 Gameticks an Zeit zur Ausführung brauchen soll.
B: Zum Gametick wird der vorher getriggerte Punch gestartet
C: Ist der Zeitpunkt indem Spieler B den von Spieler A ausgeführten Punch sieht. Also sogar kurz vor Spieler A seine eigene Aktion sieht.
D: Jetzt _sieht_ auch Spieler B seine Aktion
E: Spieler B sieht einen zweiten Frame, indem aber effektiv nichts passiert, nur der Punch ist ein Stück weiter animiert.
F: Der Punch wird ausgeführt, trifft, Schaden wird verrechnet
G: Spieler A sieht jetzt das der Punch getroffen hat, trotz geringerer Framerate also sogar vor Spieler B
H: Erst jetzt sieht Spieler B, dass er getroffen wurde
Code: Alles auswählen
Spieler A
----------+----------+----------+----------+
^ ^ ^
A C D
Spieler B
--------+--------+--------+--------+--------+
^ ^
B E
Angenommen es geht nach der Framerate von Spieler A und der Punch dauert 2 Frames
A: Punch-Taste wird gedrückt
B: Spieler B sieht gar nichts, weil noch gar kein Punch getriggert wurde
C: Jetzt kommt der Frame von Spieler A, erst jetzt wird der Punch wirklich gestartet. Spieler A sieht seinen eigenen Punch sofort
D: Spieler B sieht trotz höherer Framerate den Punch erst jetzt (man bemerke, mit Gameticks hat er den Punch schon einen Frame früher gesehen)
E: Der Punch wurde 2 Frames lang ausgeführt, trifft, Schaden wird jetzt verrechnet. Spieler A sieht das sofort
F: Spieler B sieht erst jetzt, dass er getroffen wurde, trotz höherer Framerate.
Ginge es nach der Framerate von Spieler B, würde das so laufen:
Code: Alles auswählen
Spieler A
----------+----------+----------+----------+
^ ^ ^
A C E
Spieler B
--------+--------+--------+--------+--------+
^ ^
B D
A: Spieler A drückt die Taste, sieht selber noch gar nichts
B: Der Frame von Spieler B triggert den Punch, Spieler B sieht das sofort, der ausführende Spieler selbst sieht erstmal noch gar nichts.
C: Jetzt sieht Spieler A seinen eigenen Punch erstmals
D: Der Punch ist ausgeführt, hat getroffen, Schaden wird verrechnet. Spieler B sieht das sofort
E: Erst jetzt sieht Spieler A dass sein eigener Punch getroffen hat.
Ist doch einleuchtend, dass die Zweite und Dritte Variante die deutlich schlechteren und undeterministischen Verfahren sind, als ein von den Frames losgelöster Gametick.