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

Bugger

Frischling

  • »Bugger« ist der Autor dieses Themas

Beiträge: 66

Wohnort: Bezirk Freistadt

Beruf: EDVO HTL Schüler

  • Private Nachricht senden

1

12.12.2007, 21:52

Partikelsystem - Speicherschaden?

Hi,
Ich arbeite gerade an einem eigenem kleinen Spiel und bin dabei auf folgendes Problem gestoßen:

VC6.0 Enterprise Edition meldet mir (beim Ausführen) folgendes:

Debug Error!
DAMAGE after Normal block: (#7131) at 0x07975C88



Ich hab etwas Nachgeforscht und bin durch Debuggen darauf gekommen das dieser Fehler innerhalb der Exit Funktion des Partikelsystems auftreten muss.

Ich hatte diesen Fehler schon bei einigen anderen Programmen und das einzige was ich herausfinden kann war, dass dieser Fehler nur dann auftritt wenn wärend des Programms irgendwann das Maximum an Partikel erreicht wird - was aber eigentlich kein Problem sein sollte.



Weitere Details:

Alle Zeilen die Irgendwas mit dem Partikelsystem zu tun haben:

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
... Definition der Spielklasse ...
 
     tbParticleSystem* m_pParticles;

//... Konstruktor


    ZeroMemory(this, sizeof CGame);

//... Init()


    m_pParticles = new tbParticleSystem();

//... Exit()


    if(m_pParticles){
        m_pParticles->Exit();
        TB_SAFE_DELETE(m_pParticles);
        g_pParticles = NULL;
    }

//... Load()


if(m_pParticles->Init(MAX_PARTICLES))   TB_ERROR("Partikelsystem konnte nicht initiallisieren", TB_ERROR);

//... Unload()


// Hier tritt der Fehler auf

//

if(m_pParticles)            m_pParticles->[b]Exit[/b]();

//... Render()


    m_pParticles->AddToSpriteEngine(m_pSpriteEngine);

//... Move()


m_pParticles->Move(fSecs);
m_pParticles->AddParticle(0.8f,
                      SPRITES_DUST,
                    SPRITES_DUST,
                                      < Hier die Position>,
                                      < Hier die Geschwindigkeit>,
                              tbFloatRandom(0.1f, 0.6f),
                              0.1f,
                              tbFloatRandom(0.1f, 1.0f),
                              tbColor(0.6f,1.0f,0.6f,0.60f),
                              tbColor(1.0f,0.9f,0.6f,0.05f),
                              0.0f,
                              tbFloatRandom(10.0f, 100.0f));





Das System der Spielklasse ist im Grunde das selbe wie die in den Übungs(bei)spielen.


Ich hab echt keine Ahnung was ich hier falsch mache...

:(

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

12.12.2007, 22:25

wenn du mich fragst, dann greifst du irgendwo in deinem programm auf einen ungültigen speicherbereich zu (am heap) aber der debugger checkt das erst beim beenden des programmes.

ich würd mal schaun ob im partikelsystem speichermäßig auch wirklich alles im grünen bereich is ;)

Bugger

Frischling

  • »Bugger« ist der Autor dieses Themas

Beiträge: 66

Wohnort: Bezirk Freistadt

Beruf: EDVO HTL Schüler

  • Private Nachricht senden

3

13.12.2007, 08:55

Aber dann würde der Fehler doch immer beim Aufruf von m_Particles->Exit()
auftreten und nicht nur dann, wenn das Partkel- Maximum erreicht wird - wenn ich zum Beispiel die Lebensdauer der Partikel verkürze oder die Partikelanzahl drastisch erhöhe gibt es kein Problem... :?

Bugger

Frischling

  • »Bugger« ist der Autor dieses Themas

Beiträge: 66

Wohnort: Bezirk Freistadt

Beruf: EDVO HTL Schüler

  • Private Nachricht senden

4

13.12.2007, 09:07

Das könnte interessant sein:

Wenn ich m_pParticles->Move(fSecs) (Sorry das ich das vorhin vergessen habe) und AddToSpriteEngine() weglasse gibt es keine Fehler
Wenn aber nur Move fehlt stürzt das Ganze nach kurzem ab
und wenn ich aber AddToSpriteEngine() weglasse habe ich das Gleiche Problem wie anfangs

:?

5

13.12.2007, 15:15

Hmm ich gehe mal davon aus, dass David seine Klassen Bugfrei gemacht hat. D.h. solltest du mal in deinem Code checken, ob du da nicht irgendwo den Fehler gemacht hast.
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Bugger

Frischling

  • »Bugger« ist der Autor dieses Themas

Beiträge: 66

Wohnort: Bezirk Freistadt

Beruf: EDVO HTL Schüler

  • Private Nachricht senden

6

13.12.2007, 20:17

Ich habs :D - ob ihrs glaubt oder nicht aber da ist ein ganz fieser Bug in der Partikelengine:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
..AddParticle...

// Wenn kein Platz mehr ist, nehmen wir einen zufälligen Partikel.

if(m_dwNumParticles >= m_dwMaxParticles){
      pParticle = &m_pParticles[tbIntRandom(0, m_dwMaxParticles - 1)];
}else{
     // Freien Platz beschreiben

      pParticle = &m_pParticles[m_dwNumParticles];
}

... Partikel erstellen ...

// Anzahl der Partikel erhöhen

m_dwNumParticles++;



Was daran nicht stimmt? Nun wenn kein Platz mehr frei ist füllen wir einen zufälligen Partikel und erhöhen den Zähler, welcher sich in Folge natürlich weit über die erlaubte Grenze bewegt...

es muss also (beispielsweise) heißen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
// Wenn kein Platz mehr ist, nehmen wir einen zufälligen Partikel.

if(m_dwNumParticles >= m_dwMaxParticles){
      pParticle = &m_pParticles[tbIntRandom(0, m_dwMaxParticles - 1)];
      m_dwNumParticles--;
}else{
      // Freien Platz beschreiben

      pParticle = &m_pParticles[m_dwNumParticles];
}


Nach hinzufügen dieser Zeile gibt es keine weiteren Fehler 8)

Danke für folgenden Hinweis :idea:

7

13.12.2007, 20:24

Nomen est omen... (De-) Bugger :)
Bist du so gut, und packst die Code-Abschnitte künftig in die dafür vorgesehenen Code-Tags? Tut man sich leichter mit'm Lesen. :oops:
Danke, und nix für ungut...

Faule Socke

Community-Fossil

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

8

14.12.2007, 16:21

So ich muss auch meinen senf dazugeben...
Diesmal geht es um optimierung: Es kostet zwar net viel leistung aber wer beispielsweise i++ in ner for schleife macht, verschenkt leistung. hier wird erst ein temp- objekt erzeugt, das darauf aber verworfen wird, weil es net verwendet wird. deshalb besser ++i verwenden, dann wird kein temp. objekt erzeugt und alles ist besser. aber selbst wenn man das am schlechtesten optimierte spiel nimmt und hier alle i++ durch ++i ersetzt,(abgesehen davon ist ein i++ manchmal nötig, wenn nämlich der rückgabewert verwendet wird) wird man warscheinlich nicht ein fps gewinnen, ist also zu vernachlässigen.

Socke

9

14.12.2007, 16:25

Nein, das ist nicht zu vernachlässigen, wenn es sich dabei um komplexe Klassen handelt. Bei einem POD allerdings schon ...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Faule Socke

Community-Fossil

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

10

14.12.2007, 16:41

Ja bei klassen... aber ich kenne jetzt auch keine so große klasse wo sich das lohnen würde die dann auch noch ++ überladen hat.

Socke

Werbeanzeige