Hört sich doch schon mal viel versprechend an.
- "Ich mein wenn ich die Variante mit dem "ungebremsten" Programm nehmen würde wäre ich fertig" So, damit meinst du wohl eine while-Schleife die von neu beginnt, wenn sie am Ende angelangt ist. Das überrascht mich sehr. Du hast vorher etwas von Physik erzählt (wenn mich nicht alles täuscht ???:L ). Wie rechnest du da? Ich bin nicht gerade der besten Physiker
aber in der Physik spielt die Zeit eine große Rolle. Naja, vielleicht etwas später mehr.
- "Damit hab ich die höchste Performence die jeder Rechner bringen kann." Pass auf was du sagst. Performance, was war das gleich noch mal ???:L Ah ja
- "Aber ich bin damit halt einfach noch niht so zufrieden." Ein dickes Lob von mir :applaus: Nun las uns mal überlegen wie z.B. BF 2 (was ich gerne Zocke) oder andere 3D-Spiele das Problem gelöst haben. Die Antwort ist eigentlich ganz einfach. Die Game-Engine [Physik, (Kollision), Netzwerk, ...] ist nicht mit der Grafik-Engine gekoppelt.
-> die GameE läuft mit einer niedrigeren Taktung als de GrafikE und hat zudem noch ein kleines Zeitfenster
So, wie verhindert man nun das Ruckeln am Bildschrim? Die große Frage und was zur Zeit eingesetzt wird kann ich dir nicht sagen (weiß es selber nur bruchstückhaft). Jedoch eine schon lange bekannte Technik ist das Morphing.
Funktionsweise:
- die GameE berechnet für alle Objekte eine ungefähre Position die das Objekt nach der Zeit n einnehmen wird, wenn ansonsten keine weitere Actionen auftreten (z.B. Benutzereingaben, KI-Aktionen, ...)
- die GrafikE nähert sich der Zeit n nach i Schritten. Mit dieser Information berechnet die GrafikE eine Objektposition für die aktuelle Zeit aus der letzten Position (die von der GameE stammt) und der Position nach der Zeit n
- In der Zwischenzeit werden alle eingehende Actionen bearbeitet und die exakte Position aller Objekte zur Zeit n (aus 1.) berechnet
- kurz vor dem erreichen der Zeit n wird der 1. Schritt wieder ausgeführt und die Positionen aus dem vorherigen Schritt als letzte Position der GameE gekennzeichnet
Im Falle von BF 2 akzeptieren die meisten Serverbetreiber nur Pings bis zu 150ms. Falls sich dieser kurzzeitig höher befindet wirst du vom Server gekickt. Begründung: Performance Einbruch + nicht mehr spielbar. Ich spiele meistens mit einem Ping von 40-70 ms. Ab und zu kommt auch ein konstanter Ping von 100 - 120 ms vor. Hier beobachte ich immer wieder ein leichtes Ruckeln was auf das Netzwerk zurück zu führen ist. Warum schreibe ich das hier eigentlich?
Nehmen wir mal an:
- Ich habe einen Ping von 100ms und ein weiterer Client ebenfalls
So, nun führt der Client eine Aktion aus und sendet sie zum Server (Zeit ca. 60ms) und der Server sendet sie mir (Zeit 60ms). Jetzt war alleine die Aktion 120ms unterwegs bis mein Programm es verarbeiten kann. BF 2 wandelt nun die Aktion in ein Arbeitspaket und verarbeitet es. Erst wenn die Aktion gültig und erfolgreich verarbeitet wurde ist es der GrafikE bekannt und wird dargestellt.
Im oberen Abschnitt habe ich mal was von einem Zeitfenster und im letzten Abschnitt das Wort Arbeitspaket benutzt.
Konzept Arbeitspaket: Jede Aktion im Spiel wird in einen Arbeitspaket gewandelt undmit einem Timestamp signiert. Die GameE hollt die Arbeitspakete aus einer Schlange und arbeitet sie nach und nach ab, sofern das aktuelle Paket nicht bereits aus dem Zeitfenster gefallen ist (Zeitfenster > aktuelle Zeit - Timestamp).
Der Vorteil liegt auf der Hand. Die Taktung der GameE wirkt sich nicht auf die Aktionen aus, es müssten ledeglich eine History bis zur aktueller Timestamp - Zeitfenster geführt werden und bei einer Aktionen nach gerechnet werden. Womit wir schon beim Nachteil sind, ein höherer Speicherbedarf im RAM
Vielleicht noch zwei Zahlen zur Orentierung:
- GameE alle 100ms
- GrafikE je nach Usereinstellung zwischen 60 und 100 Herz.
Ich schreibe und schreibe, aber helfen tut es dir sicherlich nicht viel. Sende mir mal deine Source an die E-Mail Adresse und ich sehe mir ihn mal. Vielleicht kann ich dir einen Tip geben
Doch versprechen kann ich nichts. Morgen Spielt ja Deutschland
und die Schweiz wird wohl 1:1 spielen. Zumindestens in der 88. Minute