[C++] Objekte serialisieren/synchronisieren etc.

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.

[C++] Objekte serialisieren/synchronisieren etc.

Beitragvon Goderion » 10.02.2018, 18:23

Hallo.

Ich habe eine Menge an unterschiedlichen Objekten und suche schon länger nach einer Möglichkeit, diese mit geringem Aufwand zu serialisieren. An welchen Stellen benötige ich die Serialisierung?
1. Objekte Laden/Speichern
2. Benutzeroberfläche, Editor, Masken
3. Synchronisation im Netzwerk

Punkt 1 sollte relativ klar sein. Im Programm ist alles durch Objekte/Klassen/Strukturen definiert und diese wollen gespeichert und geladen werden.

Mit Punkt 2 meine ich die Möglichkeit die geladenen Objekte z.B. in einem Editor zu bearbeiten. Ich könnte einfach für jeden Objekttyp eine Maske/Formular erstellen, aber das wäre sehr aufwändig.

In Punkt 3 geht es um die Synchronisation von z.B. einem Mehrspielerspiel, an dem gerade 4 Spieler teilnehmen. Irgendwie müssen die Welten/Level untereinander synchron gehalten werden und dazu muss man Objektinformationen austauschen. Auch hier könnte ich für jeden Objekttyp eine Funktion programmieren, aber auch das wäre, wie bei den Masken, viel zu aufwändig.

Meine aktuelle Lösung/Ansatz/Prototyp ist eine einfache selbst entwickelte Datenbank (Tabellen/Spalten/Indexe/Relationen). Jedes Objekte muss in speziellen Funktionen die eigene Struktur definieren und eine SaveToDatabase and LoadFromDatabase Funktion haben. Die Verarbeitung der Datensätze muss nur einmalig programmiert werden, unabhängig davon, welches Objekt darin gerade abgebildet wird.

Bis jetzt fällt mir keine bessere Lösung ein, und bevor ich dieses "Konzept" weiter verfolge, frage ich mal lieber in die Runde, ob jemand eine bessere Vorgehensweise kennt.
Benutzeravatar
Goderion
 
Beiträge: 75
Registriert: 16.09.2012, 12:02

Re: [C++] Objekte serialisieren/synchronisieren etc.

Beitragvon Chromanoid » 10.02.2018, 19:20

Als erstes würde ich keine eigene Datenbank entwickeln, sondern sowas wie sqlite verwenden.

Ich glaube Anwendungsfall 1 und 2 kann man mit dem gleichen Weg lösen, für Netzwerkübertragung kommt es sehr darauf an, was bei Dir im Spiel passiert. Da sind Delta-Updates wahrscheinlich das beste, wenn ich an die 200.000 Entities denke.

Für generische Editor-Komponenten ist Reflection natürlich ziemlich praktisch. Editor-Zusatzinformationen an Deiner Feldbeschreibung für die Speicherung in der Datenbank wären doch da sehr einfach zu realisieren. So kannst Du dann Formulare generisch erzeugen. Für Speichern von Klassen, könnte auch das hier interessant sein: https://github.com/paulftw/hiberlite So ähnlich machst Du das ja auch schon.

Ansonsten kannst Du Dir vielleicht auch mal Protocol Buffers von Google anschauen. Das wird zum Beispiel bei Diablo 3 eingesetzt (ich bin mir aber nicht sicher wofür alles genau): https://developers.google.com/protocol- ... pptutorial Siehe hier für die Definitionen, die einige Bastler extrahiert haben: https://github.com/zku/Diablo-III-Proto ... efinitions
Bei Protocol Buffers hast Du auch Möglichkeiten für Reflection, die vielleicht für den Editor (edit: und die Datenbank?) taugen. Das Protokoll an sich wäre dann auch was für die Übertragung per Netzwerk.

Die Unreal-Engine hat ja ihr tolles Property-Framework, vielleicht kann dich das auch inspirieren: https://docs.unrealengine.com/latest/IN ... roperties/
Benutzeravatar
Chromanoid
Christian Kulenkampff
Moderator
 
Beiträge: 3665
Registriert: 16.10.2002, 19:39
Wohnort: Lüneburg
Alter Benutzername: atr_23

Re: [C++] Objekte serialisieren/synchronisieren etc.

Beitragvon Goderion » 12.02.2018, 21:35

Vielen Dank für die Antwort!

Chromanoid hat geschrieben:Als erstes würde ich keine eigene Datenbank entwickeln, sondern sowas wie sqlite verwenden.

Die eigene "Datenbank" ist eigentlich so gut wie fertig, und SQLite wäre vermutlich auch Overkill (sqlite3.c hat über 200.000 Codezeilen und ist über 7 MB :shock:).
Ich brauche z.B. überhaupt kein SQL oder Indexe über mehrere Spalten. Sehr primitiv aber einfach und schnell.

Chromanoid hat geschrieben:Ich glaube Anwendungsfall 1 und 2 kann man mit dem gleichen Weg lösen, für Netzwerkübertragung kommt es sehr darauf an, was bei Dir im Spiel passiert. Da sind Delta-Updates wahrscheinlich das beste, wenn ich an die 200.000 Entities denke.

Zur Netzwerk-Synchronisation sollen nur Daten übermittelt werden, die auch nötig sind. Wie schon von dir angedeutet, bei über 200.000 Entities geht es gar nicht anders. Welche Technik ich da genau einsetzen werde, bzw. wie die Auswahl der Daten zur Synchronisation erfolgen wird, ist noch unklar.

Chromanoid hat geschrieben:Für generische Editor-Komponenten ist Reflection natürlich ziemlich praktisch. Editor-Zusatzinformationen an Deiner Feldbeschreibung für die Speicherung in der Datenbank wären doch da sehr einfach zu realisieren. So kannst Du dann Formulare generisch erzeugen.

Ganu. Auch zum Protoypen erstellen/testen sollte das sehr praktisch sein, wenn man nur die Klasse und Definition programmieren muss und der Rest (Load, Safe, Formular, Netzwerk) gleich mit erledigt ist.

Chromanoid hat geschrieben:Für Speichern von Klassen, könnte auch das hier interessant sein: https://github.com/paulftw/hiberlite So ähnlich machst Du das ja auch schon.

Sieht interessant aus.

Chromanoid hat geschrieben:Ansonsten kannst Du Dir vielleicht auch mal Protocol Buffers von Google anschauen. Das wird zum Beispiel bei Diablo 3 eingesetzt (ich bin mir aber nicht sicher wofür alles genau): https://developers.google.com/protocol- ... pptutorial Siehe hier für die Definitionen, die einige Bastler extrahiert haben: https://github.com/zku/Diablo-III-Proto ... efinitions
Bei Protocol Buffers hast Du auch Möglichkeiten für Reflection, die vielleicht für den Editor (edit: und die Datenbank?) taugen. Das Protokoll an sich wäre dann auch was für die Übertragung per Netzwerk.

Sieht auch interessant aus, vor allem aufgrund einer Definition eine C++ Klasse zu generieren. In früheren Projekten habe ich aufgrund einer Datenbank Klassen generiert, das war auch recht effektiv.

Chromanoid hat geschrieben:Die Unreal-Engine hat ja ihr tolles Property-Framework, vielleicht kann dich das auch inspirieren: https://docs.unrealengine.com/latest/IN ... roperties/

Das scheint für Formulare/Masken zu sein?
Andere größere Engines angucken finde ich immer interessant, aber da kann man sich auch leicht verlieren. ;-)
Benutzeravatar
Goderion
 
Beiträge: 75
Registriert: 16.09.2012, 12:02


Zurück zu Programmiersprachen, Quelltext und Bibliotheken

Wer ist online?

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