Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

14.03.2013, 10:57

Softwaredesign für Netzwerkspiel

Hi, ich arbeite an einem Multiplayer-RPG und habe meine Basics (Pathfinding, Collision, Rendering, Filehandling) nahezu abgeschlossen. Nun überlege ich, "wie" ich das ganze am sinnvollsten anordne.

1 Server, n Clients

Ich habe mich für ein übliches Server-Client-Konzept entschieden, wobei das Rendering (und predicted Bewegungen usw.) beim Client und alle Änderungen am Datenbestand (Schadensberechnung, "echte" Bewegung usw.) beim Server vorgenommen werden. Damit alle Parteien kommunizieren können, werde ich TCP verwenden und habe mir ein Framework gestrickt, mit dem ich Events ("Spieler A will sich nach XY bewegen" usw.) über TCP zur Gegenseite schickt. Dort können diese dann bearbeitet werden und erneut Events ("Spieler A bewegt sich nach XY mit dem Wegpunkten W1, ..., Wn" etc.) erstellt und versandt werden usw.

Multithreading, Gameloop und FPS-Rate

Meine Idee für den clientseitigen Game-Loop wäre:
  • alle Events erstellen (z.B. wenn der Spieler auf eine Position geklickt hat und dort hin will)
  • alle Events dem Netzwerk-Client geben, damit er sie versenden kann
  • Objektaktionen (Bewegungsanimation usw.) fortführe und Rendering durchführen
  • alle Events vom Netzwerk-Client holen (das sind die, die vom Server neu angekommen sind)
  • alle Events behandeln (d.h. z.B. Wegpunkte einer Figur hinzufügen)
  • FPS-Bremse

Dabei arbeitet der Netzwerk-Client mit einem eigenen Thread zum Sammeln der Events. Diese stellt er dann in einer thread-safen Queue zur Verfügung. Allerdings frage ich mich, ob durch das "alle Events vom Netzwerk-Client holen und behandeln" ich vielleicht Probleme bekommen könnte, wenn es zu viele sind, so dass die Framerate sinkt. Sollte ich dabei nur bis N Events holen und den Rest dort lassen? Oder bietet sich hier ein Thread an, der die Events parallel behandelt und bei jedem Event die View sperrt, aktualisiert und entsperrt; und ich beim Rendering entsprechend auf den Mutex dafür sperren und entsperren sollte?

Also der Art:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
View lock
Event 7 bearbeitet
View unlock
View lock
Event 8 bearbeitet
View unlock
View lock
Rendering
View unlock
View lock
Event 9 bearbeitet
View unlock


Ich vermute das würde vielleicht einen ähnlichen Effekt haben, da die Reihenfolge der Threads nicht deterministisch ist, d.h. es könnte vielleicht trotzdem passieren, dass 100 Events behandelt werden und dann erst gerendert wird?

Ich hoffe ich habe mein Problem verständlich genug formuliert :) Hat jemand eine Idee für mich?

LG Glocke

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

14.03.2013, 20:48

*summt* premature optimization *pfeif*
KISS mein Lieber, KISS. Falls der dümmste Ansatz sich als wirklich unvorteilhaft rausstellt, kann man immernoch nachbessern.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

3

15.03.2013, 10:55

*summt* premature optimization *pfeif*
KISS mein Lieber, KISS. Falls der dümmste Ansatz sich als wirklich unvorteilhaft rausstellt, kann man immernoch nachbessern.


Prinzipiell hast du damit recht! Und in meinem Fall erst recht :D Ich habe ja niemanden der mir mir Deadline im Rücken sitzt - von daher sollte ich wirklich mehr Learning-By-Doing und Trial-And-Error praktizieren ^_^

4

15.03.2013, 12:21

kA ob das in deinem Fall anwendbar ist aber wenn ich keine Ahnung habe gucke ich immer wie andere das machen die von sowas mehr verstehen. Diesen Link hatte ich hier im Forum auch schonmal gepostet, das ist so eine Sammelbesprechung auf Reddit von Netzwerkmodellen neuerer Computerspiele.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

5

15.03.2013, 19:26

Ich sags mal so:
Wenn du es schaffst soviele Nachrichten rüber zu jagen, dass deine CPU in Bedrängnis kommt, dann will ich nicht wissen wie es deiner Netzwerkkarte geht :D .
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

15.03.2013, 20:16

Ach wie das?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

15.03.2013, 20:27

Was hat das mit einem Netzwerk-Paket zu tun?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

simbad

unregistriert

8

17.03.2013, 09:53

Baue ein Pipeline.
Eine Event-Queue in der alle neuen Events vom Netz und von der Spielerinteraktion drin landen.
Eine Event-Queue aus der der Zustand des Spiels aktualisiert wird.
Das Rendern läuft separat auf dem letzten vollständigen Status.
Kommst du mit der Verarbeitung der Events nicht hinterher, kannst du zwei Threads starten.

Werbeanzeige