Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi lan::client frag spielerposition ab (https://www.delphipraxis.net/81684-lan-client-frag-spielerposition-ab.html)

chaoslion 1. Dez 2006 15:50


lan::client frag spielerposition ab
 
Hallo!

Ist es Ratsam, dass der Client bei jedem Durchlauf(mainloop) die Positionen der anderen
Spieler vom Server holt oder tut dies das Netzwerk sehr belasten?
Wie könnte man es sonst regel, wie machen es die FPS Spiele wie Quake??

mfG

Flare 1. Dez 2006 16:19

Re: lan::client frag spielerposition ab
 
Solche Spiele benutzen Interpolation (wenn das so hieß, ich bin mir da gar nicht mehr sicher, bitte korrigieren wenn falsch!). Du sendest also bei jedem Durchgang nicht komplett alle Spieler-Daten sondern bloß einen gewissen Grundteil (bei Bewegungen Richtung und Geschwindigkeit) und überträgst bloß alle paar Sekunden alle Daten. Aus den Werten für Geschwindigkeit und Richtung musst du allerdings für jeden Client die Berechnung des Spielers selber simulieren, du hast dadurch ja nicht die korrekten Daten.

Ich hoffe das hilft dir ein bisschen...


Flare

inherited 1. Dez 2006 16:47

Re: lan::client frag spielerposition ab
 
Die meisten machen das mit Vektoren, das heists du kriegst nur die Richtung und die geschwindigkeit der Bewegung und du als Client setzt das um. Natürlich musst du dann ab und an noch die genaue Position wieder nachbessern.

OregonGhost 1. Dez 2006 18:42

Re: lan::client frag spielerposition ab
 
Ja, das war ein Spaß, als Blizzard mal "aus Versehen" in einem Patch von World of Warcraft die Interpolation abgestellt hatte und alles nur noch wie wild durch die Gegend zuckte :mrgreen:

Im Prinzip kann man schon alle Positionswerte übertragen, weil sich sowieso die Richtung etc. sehr schnell ändert. Wenn du das alles überträgst, kann der Client selbst versuchen, die zukünftige Position eines Spielers vorherzusehen und die Animation in die entsprechende Richtung einzuleiten. Das macht sich manchmal dadurch bemerkbar, dass bei schlechten Latenzen jemand erst in eine bestimmte Richtung rennt, dann aber in einer anderen Richtung "geportet" wird. Auch musst du einen Kompromiss finden zwischen "der Server hat immer recht" und "der Client weiß selbst am besten, wie er sich wann wohin bewegt", denn zuweit in die eine Richtung, und der Spieler verliert die Kontrolle über sich selbst, zuweit in die andere Richtung, und man kann prima cheaten (indem man die eigene Position/Richtung vor dem Senden modifiziert).

Wenn es dir speziell um die Frage mit der Mainloop geht:
Kommt ein wenig auf die Framerate an. Mehr als etwa 30 Aktualisierungen pro Sekunde sind eigentlich im Normalfall unnötig. Außerdem kannst du nicht in der Mainloop auf die Information warten (stell dir vor, du hast 100ms Latenz, dann wäre deine Mainloop aber langsam :stupid:). Du musst sie also entweder in einem zweiten Thread abfragen oder halt mehr oder weniger asynchron übertragen (also in einem Frame anfordern und eben das nächste mal, wenn Positionen reinkommen, diese verarbeiten).
Du kannst ja auch mal in den Quellcode von Quake2 reinschauen, da gibt es sogar einen Delphi-Port von :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:05 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz