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

Phili

unregistriert

31

25.10.2006, 17:31

@T-VIRUS
Wenn ich du wäre, würd ich erstmal versuchen, dei Engine anständig zum laufen zu bringen und funktionsfähig zu machen, anstatt dic hdrum zu kümmern, ob sie 10000000 oder 10000002 Bytes braucht... :roll:

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

32

25.10.2006, 17:36

in SINGLETON ist immer global. auch wenn es lokal instanziiert wird. Deshalb ist auch dessen Zeiger immer global (auf Instanz). Also ist der Zeiger sinnlos.

Objekte wie eine Engine Oberklasse kann man ruhig global lassen, den lokal würden solche Teile extrem komplex und unter Umständen viel mehr performace verloren gehen.

Der SINN eines Singletons ist es ein globales Objekte zu kapseln und nur genau eine Instanz zuzulassen, nicht mehr und nicht weniger.

T-VIRUS

Alter Hase

  • »T-VIRUS« ist der Autor dieses Themas

Beiträge: 548

Wohnort: Göttingen(West)/Nordhausen(Ost)

Beruf: Schüler

  • Private Nachricht senden

33

25.10.2006, 17:43

Den Sinn des Singletons habe ich soweit ja verstanden aber wie ich es besten regle einen Lokalen Zugriff zugewehrleisten, da ist noch ein Problem.
Der globale Zugriff über die Funktion habe ich ja.
Was ich versuche ist folgendes-> überall wo ich mit der Engine arbeiten muss per Singletonfunktion eine Instanz(Hier einen Zeiger) zubekommen und dann mit diesem Zeiger arbeiten.

Das Problem ist hier aber das der Zeiger ja extraspeicher brauch und hier wäre wieder eine globale Variable vorteilhafter(wegen der nutzbarkeit und wegen der einmaligen deklaration).

Ich stecke also in einem kleine selbst eingebrocktem debakel.


Also wäre Koschkas Variante(globale Variable oder Singletonmethode) eher angebrachter als eine lokale Instanz per Zeiger oder?
Meine Blog:)

Wer Bugs im Text findet kann sie melden, fix erscheint irgendwann :D

MFG T-VIRUS

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

34

25.10.2006, 17:57

Oo. Immernoch nicht gepeilt:

Eine Referenz ist im Wesentlichen nichts anderes als ein Zeiger.

Nur, in deinem Beispiel hast du weder Referenzen noch Zeiger gespeichert (ausser bei den Get Methoden)!

Wenn du es also richtig machst, und dafür sorgst, dass man deinen Singleton nicht kopieren kann, dann kannst du bei der Anwendung eigentlich auch keinen Fehler machen, egal ob du nun Zeiger oder Referenzen merkst.

Wenn du es nicht glaubst, schau dir mal an, was hier ausgegeben wird:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>

struct SP
{
    double* p;
};

struct SR
{
    double& r;
};

int _tmain(int argc, _TCHAR* argv[])
{
    std::cerr << sizeof (double) << " " << sizeof (SP) << " " << sizeof (SR) << std::endl;
    char wait;
    std::cin >> wait;
    return 0;
}


So, und nun sag mit, dass du 50 * 4 = 200 Bytes sparen willst ?!?

Es gibt da einen Spruch, den man sich immer merken sollte, wenn man optimieren will: LASS ES!

Wenn du da wirklich optimieren willst, speichere den Zeiger / die Referenz nicht langfristig, sondern hole sie die jedesmal beim betreten einer Methode, die darauf zugreifen will. Das ist sowieso besser, weil dir dann keinen deinen Singleton unterm Hintern wegziehen kann, ohne dass du das merkst.

Gruss,
Rainer
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

35

25.10.2006, 17:57

Ein singleton wird 1x erstellt (normalerweise, muss nicht), und das ist meistens ganz am Anfang des Programmes. Danach kannst du es doch eh überall nutzen, insofern du es richtig definiert hast.

siehe Code oben. Wenn du globalen Zugriff hast, kannst du es auch lokal benutzen!

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//global

class Engine {...};

int main(void)
{
    //lokal

    // Refenz auf Obj, holen

    Engine::instance().start(); 
}

void dosomestupidstuff()
{
    Engine::instance().makegoodgame();
}


p.s. ein Zeiger braucht 4Bytes, auf 32 Bit Machienen, da wird dir keiner bei mehreren GB an Hauptspeicher böse sein.

T-VIRUS

Alter Hase

  • »T-VIRUS« ist der Autor dieses Themas

Beiträge: 548

Wohnort: Göttingen(West)/Nordhausen(Ost)

Beruf: Schüler

  • Private Nachricht senden

36

25.10.2006, 18:30

Also wäre die Variante die ich mit der Funktion mache eher Sinnlos und eine Methode der Klasse wie oben bei Koschka wäre besser.
Okay dann werd ich diese Version die ich nutze umbauen und diese Instancemethode wird dann aber einen Zeiger zurückgeben ;)

EDIT:
Hab ein größeres Problem.
Ich habe die Methoden GetEngineRef() und auch GetEnginePtr() eingebaut aber mein compilierer sagt ich kann ohne Objekt die Methode nicht aufrufen!

Hier etwas code wie ich die Methode aufrufen will mit dem Singleton:

C-/C++-Quelltext

1
CMDGEngine::GetEngineRef().DoSomeThing();


Das Singleton ist wie folgt implementiert:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
CMDGEngine& GetEngineRef()
{
 static CMDGEngine EngineObj;
 return EngineObj;
}

CMDGEngine* CMDGEngine::GetEnginePtr()
{
 static CMDGEngine EngineObj;
 static CMDGEngine* pEngine=&EngineObj;
 return pEngine;
}


Aber das ist eine Testimplementierung!!!
Deshalb gibt es 2 Singletons!!!
Meine Blog:)

Wer Bugs im Text findet kann sie melden, fix erscheint irgendwann :D

MFG T-VIRUS

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

37

25.10.2006, 22:15

Hi!

C-/C++-Quelltext

1
CMDGEngine& CMDGEngine::GetEngineRef()


So evtl?
Du solltest aus deinem Singleton nach Möglichkeit nur eine Referenz rausgeben. Das Objekt wird da nicht kopiert, d.h. du hast genau den Speicherverlust wie bei einem Zeiger.
Du (oder irgend ein anderer Anwender deines Singletons) laufen aber nicht die Gefahr dein Singletonobjekt versehentlich löschen zu wollen. (Daher auch den D'tor privat machen).

grüße
@D13_Dreinig

Anonymous

unregistriert

38

25.10.2006, 22:28

Zu hilfe zu hilfe! Ich muss 4 Byte mehr zahlen für einen Zeiger, zu hilfe zu hilfe!

Ey, aber sonst hat man keine Sorgen ne? Huhu? Bei mir im Haushalt gibt es keinen PC unter 1 GByte Ram, denkste mich stört da 4 Byte? Never. Außerdem: Deine 4 Byte sind nur Logisch, Physisch wird sogar ein ganzes KByte angelegt.

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

39

26.10.2006, 07:16

Au weia.

Ich gebe dir mal einen Tip. Lies dir noch einmal durch, wie ich die Singleton Klasse deklariert habe (erste Seite des Thread), dann wirst du sehen, wie deine Zugriffsmethoden deklariert aussehen müssen. Sagt dir das Wort static bei einer Methode einer Klasse etwas?

Sonst, nochmal ganz langsam zum mitschreiben:

Ein Singleton ist einfach blos ein Objekt einer Klasse. Durch spezielle Maßnahmen bei der Deklaration dieser Klasse verhindert man, dass es mehrere Objekte dieser Klasse geben kann (man kann solche Objekte nicht Kopieren oder manuell erzeugen). Der Zugriff auf diese einzige Instanz des Objekts erfolgt durch eine statische Methode in der Klasse und liefert einen Zeiger oder eine Referenz auf das Objekt.

Wenn du das nicht verstehst, benutze evtl. doch besser globale Variablen, bis dir die Begriffe Zeiger, Referenz, Klasse, Objekt, kopieren von Objekten, erzeugen von Objekten und statische deklaration von Variablen und Methoden geläufig sind.
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

T-VIRUS

Alter Hase

  • »T-VIRUS« ist der Autor dieses Themas

Beiträge: 548

Wohnort: Göttingen(West)/Nordhausen(Ost)

Beruf: Schüler

  • Private Nachricht senden

40

26.10.2006, 10:26

Okay werd das nochmal überarbeiten ;)

@UL
Hast du deine Nachricht gelesen?

EDIT:
Habs überarbeitet und nun funktionierts =)
Thx.

Ich werd die oben beschrieben Sachen mal in C++ für Spieleprogrammierer nachlesen da vieles in C++ für Dummies doch ausgelassen wurde und nur das nötigste(und davon doch nur die hälfte) erklärt wurde!
Nicht mal Referenzen wurde breit erklärt.
Meine Blog:)

Wer Bugs im Text findet kann sie melden, fix erscheint irgendwann :D

MFG T-VIRUS

Werbeanzeige