Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Jul 03, 2025 10:04

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
BeitragVerfasst: Mi Jun 16, 2010 07:51 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Zum Thema ID, die Lösungen die ich beim Überfliegen gesehen habe sind alle recht langsam und viel zu kompliziert gedacht.
Der Server legt die ID an und diese kann er über die eindeutige Speicheraddresse von dem Objektdaten nehmen.
Ich benutze ein 64Bit große variable, welche den pointer rein gibt und dann als 64Bit zahl wieder raus bekommen kann und anders rum.
So benötigt man keine komplexen berechnungen, prüfungen und so weiter.
Diese IDs sind pro Server einzigartig.
Der schöne Vorteil daran ist, man spart sich das suchen von Objekten, Spielern und so weiter in Listen, da bei einem Event die ID mit kommt und man diese ja sofort in die Speicheraddresse zurück wandeln kann. Man muss dabei beachten, dass man sicher geht, dass keine ungültigen IDs kommen, dies kann man z.B. durch das hinzufügen der ID am Anfang der Daten und dem Prüfen ob der Pointer auf einen Wert zeigt, der den selben wert wie der Pointer hat. Wenn nicht, dann ist es eine ungültige ID.

Thick server and thin client
Das Prinzip setzt sich immer mehr durch bei Office Anwendungen aber bei Games ist eine abgeschwächte Form von Vorteil.
Wenn der Client eine Änderung macht und dann den Server fragt, ob es korrekt war, dann hat man zwar eine sicheres Game aber der Teufel steckt im Detail.
Diese Variante kostet mehr Latenz als in einigen Spielearten gut ist.
Die Logik und Physik läuft auf beiden Systemen und der Client sendet Informationen über welche Aktion er ausführen will.
Der Client führt nun die Aktionen aus und beschleunigt nun vorwärts oder feuert ein Item ab.
Der Server prüft führt die Aktionen aus und die Aktionen selber prüfen dann, ob es möglich ist, dass man schon wieder schiessen kann oder auf eine Mauer auf gefahren ist. Der Server gibt in einem Intervall bzw. Event basiert dann den aktuellen stand zurück.
Diese Messages sollte man möglichst in UDP implementieren und auf reliable und ordered verzichten.

Paketgröße
Die Pakete sollten nicht größer als 500Byte sein und des so kleiner des so besser.
Benutze am besten 1Byte Alignment und eventuell ist auch http://visual-computing.intel-research.net/publications/mlaa.pdf dies einsetzbar.
Das Paket sollte möglichst schnell zusammen gesetzt werden können, also so wenig wie möglich Operationen benötigen und auch über Serialisierung wieder ausgelesen werden können.
Vermeide dynamische Daten, also String, Listen und ähnliches.
Sollte es mal wirklich notwendig sein, dann lege die maximalgröße fest und pack eine Längeninformation mit rein.
Ein Beispiel, im Spiel können bis zu 16 Spieler sein und die aktuellen spacial informationen sollen übertragen werden.
Dann kannst du einfach für 16 Spieler das Datenpaket erstellen, schreibst die aktuelle Anzahl an Spielern am Anfang und schreib die verfügbaren spielerinformationen, die restlichen slots bleiben unangetastet. Auf der gegenseite wird dann nur noch ein Pointer typecast gemacht von z.B. char* auf UpdateToClient* und so kann man ohne was zu konvertieren oder schrittweise zu lesen auf die Daten zugreifen.

Probleme bei Netwerk
Zu über 50% haben wir in der Firma Probleme mit Threads und Sockets, sobald die sache sauber läuft hat man recht selten Probleme.
Ein Beispiel aus der Praxis, wir Updaten mit einem Thread die Clients auf den aktuellen stand und ein Socket wird geschlossen.
Der Thread merkt dies nicht, da er in der Loop bereits ist und versucht an einen toten socket zu senden.
Es ist also notwendig zu Prüfen, ob der Socket noch verbunden ist, bevor gesendet wird oder einfach senden und die Fehlermeldung ab zu fangen.
Solche Probleme treten nur sporadisch auf, da mehrere Threads im Spiel sind und sind somit schwer zu debuggen.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.006s | 14 Queries | GZIP : On ]