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

23.04.2013, 22:17

Java Game, Netzwerkprogrammierung

Hallo Leute, lange nichts gehört.

Im Moment arbeite ich an einem Spielprojekt für meine Hochschule. Als Programmiersprache benutzen wir Java.
Wir haben uns für eine GameEngine namens GTGE entschieden. Die Netzwerkkomponente wollen wir jedoch ohne Engine umsetzen.

Das Spiel ist folgendermaßen aufgebaut:

Es gibt einen Lobbyserver, und Clients, die sich in diese Lobby einloggen können. Dort können die User chatten etc. und wenn alle auf einen Readybutton klicken
erstellt der Server einen neuen GameServer und die Clients starten einen GameClient, der sich auf den neuen Server connected.

Die Lobbygeschichte funktioniert bereits mit UDP ohne Probleme.
Mir machen jedoch meine TCP-Verbindungen Probleme.

Im Moment akzeptiert der Server in einem eigenen Accept-Thread die Clients, führt ein Handshake mit Initialdaten aus und startet zwei neue Handling-Threads für jeden Client.
Dort gibt es einen Thread, der ständig Datenpakete empfängt und aufbereitet, und einen der ständig Datenpakete sendet.

Auf der Clientseite habe ich den Game-Thread, der das Updaten und Rendering etc des Games beinhaltet, welcher auf die Daten die ich empfange zurückgreift.
Weiterhin habe ich auch hier jeweils einen Send und einen Receive-Thread. Der eine schickt ständig Daten raus, der andere empfängt ständig.

Mein Problem ist hier, dass ich allein schon mit zwei Clients und nur einem Sprite was dargestellt wird Framerateeinbrüche sowie Computer Leistungseinbrüche bekomme.
Mein ganzer Computer laggt.

Ich denke, dass ich die Daten entweder zu oft versende/empfange, oder einfach das ganze sehr inperformant programmiert habe.

Meine Frage ist nun also, wie ist es in Spielen üblich, das Netzwerk zu handeln. Da ich die Daten in Real-Time benötige brauche ich auch ständig neue Daten.
Sollte man die Datenübertragung auf eine gewisse Anzahl pro Sekunde beschränken, oder könnte man, wenn das ganze performanter entwickelt wird, auf Teufel komm raus
so viele Daten wie möglich pro Sekunde übertragen.

Ich habe bereits gegoogelt und auch hier im Board gesucht, aber leider nicht wirklich Antworten auf meine Frage bekommen.
Youtube-Tutorials zur Netzwerkprogrammierung die ich gefunden habe haben auch dauerhaft Daten versendet. Wobei ich dann auch Probleme hatte mit der Performance,
der Youtuber aber nicht. Da ich mehrere gute Computer zum Testen zur Verfügung habe kann ich jedoch die Hardware ausschließen. Weiterhin gab es in den Kommentaren zu den Videos auch weitere User, die die Performanceprobleme hatten.

Falls vielleicht jemand gute Turoials, Literatur o.ä. zu diesem Thema hat wäre das auch von Vorteil. Bitte hier noch einmal respektieren, dass ich die Netzwerkkomponente ohne Engine sondern selbst entwickeln will.
Weiterhin bitte ich die Programmiersprachenwahl zu respektieren.

Es steht schon sehr viel Code, weshalb ich hier zunächst auf Code Snippets verzichtet habe. Falls jemand eine spezielle Stelle des Codes betrachten möchte, werde ich diesen gerne nachreichen.

Danke
gruß Loki

2

23.04.2013, 23:58

Du könntest Dir mal zur Inspiration kryonet anschauen.

Kannst Du ein Minimalbeispiel bauen, bei dem das Problem auftritt? So vom Lesen würde ich erst mal auf einen Programmier/Bedienfehler im Umgang mit der API tippen.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

3

29.04.2013, 01:35

Afaik versucht man natürlich den Traffic zu reduzieren-einfachster ansatz ist, dass man möglichst nur dann was senden muss wenn sich was ändert->z.B. quake netzwerkmodell; einfachmal im inet nach suchen. Ansonsten gibt es den Ansatz nur die Nachrichten zu schicken; sprich die Aktionen die durchgeführt werden sollen. Des weiteren kenne ich noch den Ansatz dass man Zustände synchronisiert; aber auch da wenn möglich nur was schicken, wenn sich was änder. Alternativ gibts wirklich den Ansatz die Anzahl an updates pro sekunde zu beschränken.
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.

Antares

Frischling

Beiträge: 2

Wohnort: Manching

Beruf: Software Entwickler

  • Private Nachricht senden

4

06.06.2013, 22:58

Im Moment akzeptiert der Server in einem eigenen Accept-Thread die Clients, führt ein Handshake mit Initialdaten aus und startet zwei neue Handling-Threads für jeden Client.

Mein Rat ist nicht für jeden Client einen neuen Thread zu machen sondern einen einzigen
Handler Thread der die Sockets der Clients durcharbeitet.
Solange du jedoch glaubst nicht mehr als sagen wir mal 10 Clients zu haben sind neue Threads pro Client aber auch OK.

Auf der Client Seite sollte es mindestens 3 Threads geben:
1.Render Thread
2.Netzwerk Thread
3.Worker Thread für alles was sonst so parallel ausgeführt werden kann.

Deine Frame Rate fällt evtl deswegen weil einfach alles in einem Thread
gemacht wird auch sachen die mal länger dauern wie Netzwerk Verarbeitung.
Ausserdem gibt es dann immer noch die GC-Pause-of-Death (oder wie die hiess).
Wenn der GC mal ein "Full-GC" macht, dann kann es schon mal sein, dass
deine Renerloop für 1 sec hängt.

Mach einfach mal in den Program Arguments "-verbosegc" rein und schau wie lange ein "Full-GC"
so dauert.

Werbeanzeige