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

bassdscho

Alter Hase

  • »bassdscho« ist der Autor dieses Themas

Beiträge: 1 056

Wohnort: Heuchlingen

Beruf: Student - Technische Informatik

  • Private Nachricht senden

1

02.05.2005, 22:55

Probleme mit Klassen und ihrem Speicher

Hi,

ich habe ein Problem. Ich hab eine Klasse:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
    class CMine
    {
    public:
        static tbModel*     mModel;
        tbObject            Objekt;
        bool                bCollision;
        float               fCollStartTime, fRotSpeed;
        int                 iIndex, iVelocity, iRotDirX, iRotDirY, iRotDirZ;
        static int          Counter;
        int                 iToggle;
        float               fRange, fRotTest;

        // Konstruktor

        CMine(tbVector3 vPos, float fCollStartTime, float fTime)
        {
            iIndex = Counter;
            Counter++;
            // Überprüfungs Variable

            bool bRunning = true;

            // Variablen der Klasse Intialisieren

            this->Objekt.m_vPosition    = vPos;
            this->fRotSpeed             = TB_DEG_TO_RAD(tbFloatRandom(25.0f, 40.0f));
            this->iVelocity             = tbIntRandom(150,250);
            this->bCollision            = false;
            this->fCollStartTime        = fCollStartTime;
            iToggle = 0;
            fRange = 0.0f;
            fRotTest = 30.0f;

            // Rotationrichtungen festlegen

            while(bRunning == true)
            {
                this->iRotDirX = tbIntRandom(-1,1);
                if(iRotDirX == -1 || iRotDirX == 1)
                    bRunning = false;
            }
            bRunning = true;

            while(bRunning == true)
            {
                this->iRotDirY = tbIntRandom(-1,1);
                if(iRotDirY == -1 || iRotDirY == 1)
                    bRunning = false;
            }
            bRunning = true;

            while(bRunning == true)
            {
                this->iRotDirZ = tbIntRandom(-1,1);
                if(this->iRotDirZ == (-1) || this->iRotDirZ == 1)
                    bRunning = false;
            }

            this->Objekt.m_vRotation.x = (float)(this->fRotSpeed * this->iRotDirX);
            this->Objekt.m_vRotation.y = (float)(this->fRotSpeed * this->iRotDirY);
            this->Objekt.m_vRotation.z = (float)(this->fRotSpeed * this->iRotDirZ);
        } // Konstruktor


// dann kommen noch ein paar Methoden


Ich brauch 512 Instanzen von dieser Klasse!!
Also im Moment mache ich das so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
    for(int iX = 0; iX < ADM_OF_X_AXE; iX++)
    {
        for(int iY = 0; iY < ADM_OF_Y_Z_AXE; iY++)
        {
            for(int iZ = 0; iZ < ADM_OF_Y_Z_AXE; iZ++)
            {
                this->MineArray[iX][iY][iZ] = new CMine(tbVector3(iX * RASTER_OF_PLANE_X, iY * RASTER_OF_PLANE_Y_Z, iZ * RASTER_OF_PLANE_Y_Z), 0.5f, fTime);
            }
        }
    }

Ich hab ein Mehrdimsionales Array (mit dem kann ich leichte umgehen als mit einem normalen) und rufe jedesmal den Konstruktor auf und üergebe dem ein paar berechnete Werte.

Das ganze dauert jetzt aber ne ganze weile.
AMD 3000+ ca 30sec
1,5 Ghz Centrino ca 2 Min

wie mach ich das schneller???
Verlierer jammern immer von wegen ihr bestes!
Sieger gehen nach Hause und vögeln die Ballkönigin!

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

02.05.2005, 23:32

Bei konstruktoren kann man viele Initialisierungen beschleunigen durch sowas:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
myModell::myModell(Engine *p) : parent(p), next(NULL), previous(NULL), g_pownTextur(NULL), g_pIndexBuffer(NULL),
                                licht(NULL), vertices(NULL), Index(NULL), VertexDecl(NULL), binary(NULL)cpp]

Dieser Block erscheint mir völlig sinnlos:
[cpp]// Rotationrichtungen festlegen 

            while(bRunning == true) 
            { 
                this->iRotDirX = tbIntRandom(-1,1); 
                if(iRotDirX == -1 || iRotDirX == 1) 
                    bRunning = false; 
            } 
            bRunning = true; 

            while(bRunning == true) 
            { 
                this->iRotDirY = tbIntRandom(-1,1); 
                if(iRotDirY == -1 || iRotDirY == 1) 
                    bRunning = false; 
            } 
            bRunning = true; 

            while(bRunning == true) 
            { 
                this->iRotDirZ = tbIntRandom(-1,1); 
                if(this->iRotDirZ == (-1) || this->iRotDirZ == 1) 
                    bRunning = false; 
            }


Zieh einfach eine Zufallszahl zwischen 0 und 1. Dann boxed du es in ein Int und siehe da die Kommas sind abgeschnitten.

bassdscho

Alter Hase

  • »bassdscho« ist der Autor dieses Themas

Beiträge: 1 056

Wohnort: Heuchlingen

Beruf: Student - Technische Informatik

  • Private Nachricht senden

3

03.05.2005, 15:08

Also zu der Zufallszahl:
Wenn ich das so machen würde, wäre die Null auch dabei und das geht nicht.

Das mit den Variablen und dann (NULL) kapier ich nicht. was bewirkt das?
Verlierer jammern immer von wegen ihr bestes!
Sieger gehen nach Hause und vögeln die Ballkönigin!

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

03.05.2005, 15:19

Stümmt....
Dann mach es so rand 0 oder 1 wenn 0 dann =-1

Das oben initialisiert die vorne stehende Var mit dem in den Klammern stehenden Wert.

Mathias

Frischling

Beiträge: 29

Wohnort: Berlin

Beruf: Schüler

  • Private Nachricht senden

5

03.05.2005, 18:01

Zitat


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
            // Rotationrichtungen festlegen

            while(bRunning == true)
            {
                this->iRotDirX = tbIntRandom(-1,1);
                if(iRotDirX == -1 || iRotDirX == 1)
                    bRunning = false;
            }
            bRunning = true;

            while(bRunning == true)
            {
                this->iRotDirY = tbIntRandom(-1,1);
                if(iRotDirY == -1 || iRotDirY == 1)
                    bRunning = false;
            }
            bRunning = true;

            while(bRunning == true)
            {
                this->iRotDirZ = tbIntRandom(-1,1);
                if(this->iRotDirZ == (-1) || this->iRotDirZ == 1)
                    bRunning = false;
            }



Dieser Code-Abschnitt könnte durchaus einige Zeit in Anspruch nehmen,
je nach dem wie es der "Zufall" will. :P
Ich würde dir empfehlen die Schleifen wegzunehmen und stattdessen
einfach eine 1 zu addieren oder subtrahieren, wenn 0 rauskommt.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
int iAdd = 1;

this->iRotDirZ = tbIntRandom(-1,1);
if(this->iRotDirZ == 0)
{
 this->iRotDirZ += iAdd;
 iAdd *= -1;
}


Das was dabei am Ende rauskommt wird sich wohl kaum allzusehr unterscheiden,
der Vorteil ist aber, dass etliche Schleifendurchläufe vermieden werden, welche
viel Zeit kosten (können). Um auf Geschwindigkeit zu optimieren ist es eh ratsam Schleifen maßvoll einzusetzen.

Ansonsten sehe ich eigentlich keine Ansätze für grobe Optimierungen.
Wobei ein eindimensionales Array und eine einzige Schleife zur Erzeugung der Instanzen vielleicht noch etwas rausschlagen könnte. :P

bassdscho

Alter Hase

  • »bassdscho« ist der Autor dieses Themas

Beiträge: 1 056

Wohnort: Heuchlingen

Beruf: Student - Technische Informatik

  • Private Nachricht senden

6

03.05.2005, 20:05

Aber dann kann ich doch gleich schreiben:

C-/C++-Quelltext

1
2
3
this->iRotDirZ = tbIntRandom(-1,1);
if(this->iRotDirZ == 0)
this->iRotDirZ = -1;


ich versuchs mal und geb euch dann bescheid
:roll:
Verlierer jammern immer von wegen ihr bestes!
Sieger gehen nach Hause und vögeln die Ballkönigin!

bassdscho

Alter Hase

  • »bassdscho« ist der Autor dieses Themas

Beiträge: 1 056

Wohnort: Heuchlingen

Beruf: Student - Technische Informatik

  • Private Nachricht senden

7

03.05.2005, 20:40

Tja, verwirrend:
Also ich hab mal alles auskommentiert im Konstruktor. Die Geschwindigkeit hat sich ein bisschen zum besseren gewendet aber nicht überagend viel.

Dann hab ich heut schon mit meinem Programmier Prof geredet. Wit hatten es zufällig gerade von dynamischer Speicherveraltung. Ich hab dann gefragt was schneller ist Heap oder Stack (new Operator oder "array[30]"). Der wusste das leider nicht und hat mir dann mal vorgeschlagen ich soll doch ein Proggie schreiben das das testet.

Also hab ich ein Proggi geschrieben das mir 2 double arrays anlegt und initialisiert mit dem Stack gehts leider nur bis ca. 20000 und da dauerte das ganze 0ms. beim Heap mit 20Mio doubles 470ms. weiter gings bei dem dann auch nicht mehr.


Jetzt weiß ich gar nicht mehr wo rans liegt.
Verlierer jammern immer von wegen ihr bestes!
Sieger gehen nach Hause und vögeln die Ballkönigin!

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

8

03.05.2005, 22:10

Schon mal getestet wielange nur die schleifen brauchen?

bassdscho

Alter Hase

  • »bassdscho« ist der Autor dieses Themas

Beiträge: 1 056

Wohnort: Heuchlingen

Beruf: Student - Technische Informatik

  • Private Nachricht senden

9

04.05.2005, 11:55

noch nicht, kann ich ja mal machen
Verlierer jammern immer von wegen ihr bestes!
Sieger gehen nach Hause und vögeln die Ballkönigin!

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

10

04.05.2005, 14:23

Da fällt mir ein:
ADM_OF_X_AXE wie groß ist das? weil bei mir hat ne schleife ewig dedauert, weil die var zu klein war.....

Werbeanzeige