[2D Rollenspiel] Daten effizient speichern.



  • Hi Leute,

    ich hab mal wieder ein Problem 😞
    Es geht darum, dass ich eine Klasse <Welt> habe die sechs Instanzen der Klasse
    <Ebene> (Keller2, Keller1, Erdgeschoss, Stockwerk1, ..., Stockwerk3) enthält.
    Die Ebenen selbst enthalten eigentlich nur 4 Int-Arrays[100][100], die
    Operatoren "=" und "==" sowie die Methode "Serialize".

    Ich würde das ganze Werk nun gerne serialiseren.
    Habe ich auch gemacht... Fazit: Datei > 280MB

    Eigentlich sollten es doch ca. 10000 * 4 * 6 = 240000 Byte ~ 0,25MB sein, oder
    nicht???

    Kann mir wer sagen wie diese Differenz zu Stande kommt?

    Danke im Vorraus,
    Khadgar



  • Ein int ist in der Regel 4 Byte groß..

    Kommt aber noch nicht an deine 280 MB ran 😉



  • Hi!

    Schreib mal wie die Daten gespeichert werden! (also die funktion)



  • Wollen wir das mal aufbröseln 🙂

    Die Klasse DWelt:

    #include "DAbstraktum.h"
    #include "DEbene.h"
    
    class DWelt : public DAbstraktum  
    {
    public:
    	DWelt();
    	virtual ~DWelt();
    
    	DEbene Keller2;
    	DEbene Keller1;
    	DEbene Erdgeschoss;
    	DEbene Stockwerk1;
    	DEbene Stockwerk2;
    	DEbene Stockwerk3;
    };
    

    Die Klasse DEbene:

    #include "DAbstraktum.h"
    #include "DPhysikum.h"
    #include "DLebewesen.h"
    
    class DEbene : public DAbstraktum  
    {
    public:
    	DEbene();
    	virtual ~DEbene();
    
    	void Serialize(CArchive & ar);
    
    	DEbene & operator= (const DEbene & rhs);
    	bool operator== (const DEbene & rhs);
    
    	int passierbarkeitsLayer[100][100];
    	int bodenLayer[100][100];
    	int objektLayer[100][100];
    	int kreaturenLayer[100][100];
    };
    

    Und die zugehörige Funktion:

    SetzePassierbarkeitsLayer();	
    
    	CFile e(m_sDateiname, CFile::modeCreate);
    	e.Close();
    
    	CStdioFile f(m_sDateiname, CFile::modeWrite);
    	CArchive ar(&f, CArchive::store);
    
    	welt.Keller2.Serialize(ar);
    	welt.Keller1.Serialize(ar);
    	welt.Erdgeschoss.Serialize(ar);
    	welt.Stockwerk1.Serialize(ar);
    	welt.Stockwerk2.Serialize(ar);
    	welt.Stockwerk3.Serialize(ar);
    
    	ar.Close();
    	f.Close();
    

    @DrGreenthumb:
    Stimmt, das hatte ich nicht bedacht.

    @DasPinsch:
    Dank deiner Nachfrage musste ich die "DateiSpeichern"-Funktion wieder
    serialiseren lassen (hatte das inzwischen über Binärdaten probiert) und jetzt
    wo ich die serialisierung erneut implementiert hatte, geht es 🙂
    Also dank dir vielmals für die Nachfrage denn ohne diese hätte ich die
    Serialiserung dieser Daten vermutlich ganz aufgegeben :)))))

    Vielen Dank Euch Beiden,
    Khadgar


Anmelden zum Antworten