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

Andreas

Frischling

  • »Andreas« ist der Autor dieses Themas

Beiträge: 77

Beruf: Schüler

  • Private Nachricht senden

1

11.10.2007, 20:28

Problem mit releasen und laden von Texturen

Hallo, ich habe schon mehrfach die Suche verwendet, finde aber leider keinen passenden Artikel:

Ich habe eine Klasse InfoText, die Texturen lädt, und wenn der Infotext wieder geschlossen wird, werden die dazugehörigen Texturen released.
Der Infotext kann aber sofort neu gestartet werden.

Jetzt ist das Problem, das wenn ich den Infotext starte, kann ich durch die Seiten einfach navigieren.
Wenn ich den Infotext zum ersten Mal schließe und dann neustarte, kann ich nicht mehr navigieren, es wird nur noch eine Textur angezeigt.
Nach meistens 3 Mal starten stürtzt das Programm im Texturmanager bei AddRef() in GetTexture() mit Acess Violation ab. (War zumindest beim Debuggen so)

So sieht das Laden der Texturen in dem Konstruktor des Infotextes aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
TB_INFO("Im InfoText");
TB_INFO("Lade Texturen");
        
    for(int i = 0; i < m_iAnzahl_Seite; i++)
    {
        sprintf(acText, "Seite%i", i);
        g_pSpiel->m_pGame->ReadINIString(Section, acText, textureName, 256, filename);
        m_pTexturen[i] = tbTextureManager::Instance().GetTexture(textureName, FALSE);
        
        if(!m_pTexturen[i]) TB_INFO("FATALER FEHLER");
       }
TB_INFO("Habe Texturen geladen");
    m_iSeite = 0;
    


So wird die GUI für den Infotext initialisiert:

C-/C++-Quelltext

1
2
3
4
5
6
g_pSpiel->m_pGUI->CreateImage(20, 1, tbVector2(156.0f, 128.0f), tbVector2(512.0f, 512.0f), m_pTexturen[0]);
    g_pSpiel->m_pGUI->CreateButton(21, 1, tbVector2(550.0f, 600.0f), tbVector2(32.0f), "", tbVector2(192.0f, 0.0f), TRUE, 1, "Zurück", 1.0f);
    g_pSpiel->m_pGUI->CreateButton(22, 1, tbVector2(590.0f, 600.0f), tbVector2(32.0f), "", tbVector2(288.0f, 0.0f), TRUE, 1, "Schließen", 1.0f);
    g_pSpiel->m_pGUI->CreateButton(23, 1, tbVector2(630.0f, 600.0f), tbVector2(32.0f), "", tbVector2(224.0f, 0.0f), TRUE, 1, "Vor", 1.0f);
    g_pSpiel->m_pGUI->GetElement(21)->Show(FALSE);
    if(m_iAnzahl_Seite == 1) g_pSpiel->m_pGUI->GetElement(23)->Show(FALSE);

Hier wird in der Move-Methode zwischen den Seiten navigiert:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
switch(ID)
    {
    case 21:
        m_iSeite--;
        dummy = (tbGUIImage*) g_pSpiel->m_pGUI->GetElement(20);
        dummy->SetTexture(m_pTexturen[m_iSeite]);
        break;
    case 23:
        m_iSeite++;
        dummy = (tbGUIImage*) g_pSpiel->m_pGUI->GetElement(20);
        dummy->SetTexture(m_pTexturen[m_iSeite]);
        break;
    case 22:
        return TRUE;
    }


Wenn der Infotext weggeklickt wird, sollen die Texturen released werden:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
TB_INFO("Entferne Texturen");
        g_pSpiel->m_pGUI->DeleteElement(20);
        g_pSpiel->m_pGUI->DeleteElement(21);
        g_pSpiel->m_pGUI->DeleteElement(22);
        g_pSpiel->m_pGUI->DeleteElement(23);
        TB_INFO("LÖSCHE SEITE 1"); 
        tbTextureManager::Instance().ReleaseTexture(m_pInfoDialog->m_pTexturen[0]);
        TB_INFO("LÖSCHE SEITE 2");
        tbTextureManager::Instance().ReleaseTexture(m_pInfoDialog->m_pTexturen[1]);
TB_INFO("Habe Texturen Entfernt");
        TB_SAFE_DELETE_ARRAY(m_pInfoDialog->m_pTexturen);
        
        TB_SAFE_DELETE(m_pInfoDialog);
        m_pInfoDialog = NULL;


Wenn jetzt wieder der Infotext angewählt wird, wird eine neue Instanz von CInfoText erzeugt und im Konstruktur beginnt das Laden der Texturen von vorn.

Ich habe ein Paar Testausgaben eingebaut, damit man leichter den Ablauf nachvollziehen kann:

[list]
INFO: Im InfoText (InfoText.cpp, Zeile 15, Funktion (Unbekannt))
INFO: Lade Texturen (InfoText.cpp, Zeile 22, Funktion (Unbekannt))
INFO: Habe Texturen geladen (InfoText.cpp, Zeile 53, Funktion (Unbekannt))
INFO: In der MoveMethode (InfoText.cpp, Zeile 60, Funktion (Unbekannt))
INFO: In der MoveMethode (InfoText.cpp, Zeile 60, Funktion (Unbekannt))
INFO: Entferne Texturen (Game.cpp, Zeile 514, Funktion (Unbekannt))
INFO: LÖSCHE SEITE 1 (Game.cpp, Zeile 522, Funktion (Unbekannt))
INFO: LEIDER NICHT Das Heißt diese Seite wurde noch nicht vollständig gelöscht (tbTextureManager.cpp, Zeile 247, Funktion (Unbekannt))
INFO: LÖSCHE SEITE 2 (Game.cpp, Zeile 524, Funktion (Unbekannt))
INFO: TEXTUR WIRD GELÖSCHT //Textur wurde vollständig gelöscht(tbTextureManager.cpp, Zeile 238, Funktion (Unbekannt))
INFO: Habe Texturen Entfernt (Game.cpp, Zeile 530, Funktion (Unbekannt))
INFO: Im InfoText (InfoText.cpp, Zeile 15, Funktion (Unbekannt))
INFO: Lade Texturen (InfoText.cpp, Zeile 22, Funktion (Unbekannt))
INFO: Erhöhe Ref (tbTextureManager.cpp, Zeile 1077, Funktion (Unbekannt))
INFO: Habe Ref erhöht (tbTextureManager.cpp, Zeile 1079, Funktion (Unbekannt))
INFO: Habe Texturen geladen (InfoText.cpp, Zeile 53, Funktion (Unbekannt))
INFO:In der MoveMethode (InfoText.cpp, Zeile 60, Funktion (Unbekannt))
INFO: Entferne Texturen (Game.cpp, Zeile 514, Funktion (Unbekannt))
INFO: LÖSCHE SEITE 1 (Game.cpp, Zeile 522, Funktion (Unbekannt))
INFO: LEIDER NICHT (tbTextureManager.cpp, Zeile 247, Funktion (Unbekannt))
INFO: LÖSCHE SEITE 2 (Game.cpp, Zeile 524, Funktion (Unbekannt))
INFO: LEIDER NICHT (tbTextureManager.cpp, Zeile 247, Funktion (Unbekannt))
INFO: Habe Texturen Entfernt (Game.cpp, Zeile 530, Funktion (Unbekannt))
INFO: Im InfoText (InfoText.cpp, Zeile 15, Funktion (Unbekannt))
INFO: Lade Texturen (InfoText.cpp, Zeile 22, Funktion (Unbekannt))
INFO: Erhöhe Ref
[/list]
Am Anfang sieht man im Log, dass der Referenzzähler nicht erhöht wird, da der Infotext ja zum ersten Mal gestartet wird. Beim löschen aber wird nur eine der beiden Texturen gelöscht, d.h. der Referenzzähler ist nicht 0 geworden, beim zweiten Mal sogar keine mehr.
Aufgrund des ncihtlöschens wird der Referenzzähler auch im folgenden erhöht, obwohl diese Meldung eigentlich gar nicht kommen dürfte.

Hat jemand eine Idee wo der Fehler sein könnte, Manuell hab ich so zumindest den Referenzzähler nicht erhöht.

Vielen Dank und viele Grüße

Andreas

Andreas

Frischling

  • »Andreas« ist der Autor dieses Themas

Beiträge: 77

Beruf: Schüler

  • Private Nachricht senden

2

13.10.2007, 16:24

Ich hab den Fehler gefunden.
In der TribaseEngine muss vom ImageEffekt die Textur entfernt werden, bevor man sie released.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

3

13.10.2007, 16:55

Super, damit gehörst du zu den Leuten, die auch selbst noch weiter an einem Problem arbeiten und nicht einfach auf die Hilfe anderer hoffen. Sehr gut!
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Werbeanzeige