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