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

Errschaffer

Alter Hase

  • »Errschaffer« ist der Autor dieses Themas

Beiträge: 865

Wohnort: Frankfurt

  • Private Nachricht senden

1

10.04.2009, 00:09

Arbeitsspeicher geht zu neige ;)

Hallo,
hab das Problem das nach und nach bei meinem Spiel der RAM zu läuft.

Das größere Porblem ist aber das ich nicht weiss woran das liegt. Sowas passiert ja nur wenn Objekte erzeugt werden die aber nicht wieder richtig freigegeben werden. Und das erzeugen von Objekten passiert eigentlich nur an 2 Stellen in meinem Spiel. Die Spieler am anfang und die Schüsse.

Also kann es nur an den Schüssen liegen da die ja nicht nur am anfang erzeugt werden. Aber der RAM läuft auch voll wenn ich keinen Schuss abfeuere.

Woran kann sowas noch liegen?

Schaut selber (aufgenommen nach 1 min Laufzeit):

(Link)

Helmut

5x Contest-Sieger

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

2

10.04.2009, 00:16

Vermutlich gibts du irgendwelche Objekte von der SDL nicht wieder frei, Texturen oder so. Kommentier einfach den Code deiner Hauptschleife nacheinander aus, bis dus hast, oder benutz nen Leakdetector:)

Ciao
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender)

n0_0ne

1x Contest-Sieger

  • Private Nachricht senden

3

10.04.2009, 00:27

OK... 1,3GB in 1 min ist ein übles speicherleck xD
Ich denke du machst den Fehler, dass du Bilder immer wieder neu lädst, und die verwendest, anstatt nur einmal das Bild zu laden, und den Sprites etc dann einen Pointer darauf zu geben...

BTW: Zählt der Stack im Task-Manager eigentlich auch? und kann der so groß werden?

Edit: wie funktioniert das mit dem leakdetector?

Errschaffer

Alter Hase

  • »Errschaffer« ist der Autor dieses Themas

Beiträge: 865

Wohnort: Frankfurt

  • Private Nachricht senden

4

10.04.2009, 00:30

Also die Stelle hab ich gefunden. Und zwar an der Stelle wo ich per SDL_ttf die FPS und die Leben ausgeben lasse.

Ich schau mal gleich woran es genau liegt.

Errschaffer

Alter Hase

  • »Errschaffer« ist der Autor dieses Themas

Beiträge: 865

Wohnort: Frankfurt

  • Private Nachricht senden

5

10.04.2009, 00:48

Problem etwas behoben.

Jetzt steigt er pro Minute "nur noch" um 60mb und nicht um 1 GB ;).
Problem war das er den Font immer wieder geladen hat.
Zudem konnte ich jetzt meine FPS dadurch noch von 85 auf 110 steigern.

Errschaffer

Alter Hase

  • »Errschaffer« ist der Autor dieses Themas

Beiträge: 865

Wohnort: Frankfurt

  • Private Nachricht senden

6

10.04.2009, 09:33

Einmal brauch ich nochmal eure Hilfe.

Das große Memory Leak habe ich gestopft (1GB pro Minute).
Nun zieht er aber immer noch anscheinend 60MB die Minute.

Aber auch nicht immer. Also habe ich das Spiel offen und minimiere es um den Task Manager auf zurufen erhöt sich der Speicher um 1MB die Sekunde.

Anders aber wenn ich wieder das Fenster vergrößere und wieder kleiner mache ist es wieder normal also Startpunkt 5MB.

Er zieht also nur unnötig Speicher wenn ich das Fenster minimiere.

Jemand eine Idee?

Gotbread

Alter Hase

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

7

10.04.2009, 10:58

Ohne entsprechenden Code kann ich nur meine Kristallkugel befragen, und die sagt mir:

Irgentein _großes_ objekt, z.b. ein Sprite wird andauernt geladen, aber nicht mehr freigegeben. guck mal in deiner gameloop nach stellen, wo du was lädst.

vllt gibt sdl dein objekt ja wieder frei, wenn es zurück in den vollbildmodus kommt
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

Errschaffer

Alter Hase

  • »Errschaffer« ist der Autor dieses Themas

Beiträge: 865

Wohnort: Frankfurt

  • Private Nachricht senden

8

10.04.2009, 11:48

Das Porblem tritt immer noch an der Stelle auf an der ich mit SDL_ttf was ausgebe:


C-/C++-Quelltext

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

    m_pPlayer1Out->Render();
    m_pPlayer2Out->Render();

    //Leben anzeigen

    m_pLiveOutPlayer1->SetText (m_pPlayer1->GetALive ());
    m_pLiveOutPlayer1->Render ();

    m_pLiveOutPlayer2->SetText(m_pPlayer2->GetALive ());
    m_pLiveOutPlayer2->Render ();

    //FPS ausgeben

    m_pFramesOut->SetText(m_Framesstring);
    m_pFramesOut->Render ();



Bedeutende Funktionen dafür sind:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void CText::Init (SDL_Surface *screen,float fXPos,float fYPos,int Size)
{
    m_pscreen=screen;
    
    

    //Font laden

    m_Font = TTF_OpenFont("Data/FreeSans.ttf",Size);

   //Farbe

    m_textColor.r = 255;
    m_textColor.g = 0;
    m_textColor.b = 0;

    
    

    m_Rect.x=static_cast<int> (fXPos);
    m_Rect.y=static_cast<int> (fYPos);

}



und...

C-/C++-Quelltext

1
2
3
4
5
6
void CText::SetText(string Text)
{
m_Text=TTF_RenderText_Solid(m_Font,Text.c_str(),m_textColor);


}


Ich kann aber jetzt nichts herauslesen was das Memory Leak verursacht.

9

10.04.2009, 13:34

Zitat von »"n0_0ne"«

BTW: Zählt der Stack im Task-Manager eigentlich auch? und kann der so groß werden?

Der Stack kann nicht so gross werden. Normalerweise ist er auf wenige Megabytes beschränkt.


Zitat von »"Errschaffer"«

Das Porblem tritt immer noch an der Stelle auf an der ich mit SDL_ttf was ausgebe:

Müsstest du das nicht irgendwie wieder freigeben?

C-/C++-Quelltext

1
m_Text=TTF_RenderText_Solid(m_Font,Text.c_str(),m_textColor);

Ansonsten probier ein wenig aus mit Auskommentieren. Dann solltest du den Fehler relativ schnell eingrenzen können.

Errschaffer

Alter Hase

  • »Errschaffer« ist der Autor dieses Themas

Beiträge: 865

Wohnort: Frankfurt

  • Private Nachricht senden

10

10.04.2009, 15:29

Ja ich hab je die Stelle gefunden. Und zwar an der wo ich einen Text setze (SetText (); )

Nur wie soll ich das freigeben? Wenn ich m_Text delete stürzt das Programm ab (Null Pointer)

Werbeanzeige