Aktuelle Zeit: 14.05.2025, 00:34

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Problem mit dem Laden von Texturen
BeitragVerfasst: 21.06.2008, 20:24 
Offline
Benutzeravatar

Registriert: 21.06.2008, 20:00
Beiträge: 8
Erstmal hoffe ich, dass das hier überhaupt reingehört; Programmiererfahrung habe ich nämlich schon, nur mit Irrlicht arbeite ich das erste mal.

Die Situation:
Mein Programm ist in mehrere "Szenen" aufgeteilt, die alle etwas anderes darstellen. Es wird aber immer nur eine Szene gleichzeitig dargestellt. Deswegen habe ich einen Pointer vom Typen einer Basisklasse, in dem immer die aktuelle Szene, also ein Objekt einer davon abgeleiteten Klasse, gespeichert wird.
Das Problem ist jetzt folgendes:
In der ersten Szene lade ich eine Textur und zeige sie als Hintergrundbild an -> Alles kein Problem. Wenn ich jetzt jedoch eine zweite Szene lade, und darin eine Textur lade(driver->getTexture("Textures/Wood.tga");), bricht das Programm mit einer Exception ab:
Zitat:
Unbehandelte Ausnahme bei 0x10045cf2 in IrrlichtGame.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0xabab0061.

Die Position ist jedes mal die selbe. Der driver-pointer ist noch in Ordnung, das habe ich nachgeprüft. Wenn ich das laden der Textur weg lasse, funktioniert auch alles einwandfrei - und danach wird noch mehrmals auf ihn zugegriffen.
Jetzt meine Frage: Kann es sein, dass man keine Texturen mehr laden kann, wenn man bereits einen Main-Loop hatte (man also device->run() und das ganze Zeug schon mal ausgeführt hat)? Anders kann ich mir das ganze nämlich nicht mehr erklären...

Wenns hilft, poste ich natürlich auch noch meinen Code.

Danke schon mal im Voraus,

Drag-On


Nach oben
 Profil  
 
BeitragVerfasst: 21.06.2008, 20:35 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
Geh mal mit nem debugger durch.
Zur not auch mal den irrlicht source debuggen.

Laden von texturen in der mainloop ist kein problem. also daran wirds nicht liegen.

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
BeitragVerfasst: 21.06.2008, 20:40 
Offline
Benutzeravatar

Registriert: 21.06.2008, 20:00
Beiträge: 8
Hab ich auch schon versucht (als erstes sogar), aber sobald ich versuche, in die getTexture-Methode reinzusteppen (was für ein wort^^), kommt eben der genannte Fehler.

Drag-On


Nach oben
 Profil  
 
BeitragVerfasst: 21.06.2008, 23:24 
Offline
Moderator
Benutzeravatar

Registriert: 15.04.2007, 20:20
Beiträge: 505
Wohnort: Reelsen
Meiner Meinung nach wäre Code hier wirklich hilfreich :)

(Mein erster Tipp wäre auch gewesen, dass der Pointer in driver kaputt ist, vllt mach mal nen *kompletten* Backtrace im Debugger, inklusive Irrlicht. Das musst du dafür natürlich mit Debuginfos neu compilieren)

_________________
Meine Gameengine :)
Bild


Nach oben
 Profil  
 
BeitragVerfasst: 22.06.2008, 13:52 
Offline
Benutzeravatar

Registriert: 21.06.2008, 20:00
Beiträge: 8
Hier mal die betroffenen Codestellen:
WinMain
Code:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
   // Variablen initialisieren...

   // Start Main Menu
   gamescene = (cBaseScene*)(new cMainMenu());

   while (gamescene != NULL && device != NULL)
   {
      gamescene->run();   // Main Loop
   }

   soundEngine->drop();
   device->closeDevice();

   return 0;
}

cMainMenu.run
Code:
int cMainMenu::run()
{
   // Load Backgroundtexture
   ITexture *texture = driver->getTexture("Textures/BG.tga"); // Funktioniert einwandfrei

   // GUI initialisieren etc...

   while((!sceneChanged) && device->run())
   {
      driver->beginScene(true, true, SColor(255,100,101,140));
      smgr->drawAll();
      guienv->drawAll();
      driver->endScene();
   }
   
        // Die Szene wurde beendet, z.B. durch onNewGame

   delete texture;

   return 0;
}

cMainMenu.onNewGame
Code:
void cMainMenu::onNewGame()
{
        // aufräumen...
   delete this;
   gamescene = new cGame(); // Start Gamescreen
}

cGame.run
Code:
int cGame::run()
{
   // Load Model
   IAnimatedMesh *mesh = smgr->getMesh("Models/Spielfeld.obj");
   IAnimatedMeshSceneNode *node = smgr->addAnimatedMeshSceneNode( mesh );
   if (node)
   {
      node->setMaterialFlag(EMF_LIGHTING, false);
      ITexture *texture = driver->getTexture("Textures/Wood.tga"); // Hier tritt der Fehler auf.
                     // Es ist nicht möglich, in die getTexture-Methode zu springen, schon beim Aufruf wird die Exception
                     // geworfen. Lasse ich die Zeile weg, funktioniert alles einwandfrei.
      node->setMaterialTexture( 0,  texture);
   }
   smgr->addCameraSceneNode(0, vector3df(0,30,-40), vector3df(0,5,0));

   while(device->run())
   {
      driver->beginScene(true, true, SColor(255,100,101,140));
      smgr->drawAll();
      guienv->drawAll();
      driver->endScene();
   }

   return 0;
}


Ist jetzt relativ viel Code, ich habe aber versucht, alles uninteressante rauszukürzen.

Zitat:
(Mein erster Tipp wäre auch gewesen, dass der Pointer in driver kaputt ist, vllt mach mal nen *kompletten* Backtrace im Debugger, inklusive Irrlicht. Das musst du dafür natürlich mit Debuginfos neu compilieren)
Danke, Hab ich zwar jetzt grade keine Zeit für, heute Abend werde ich mich aber mal daran versuchen.

Drag-On


Nach oben
 Profil  
 
BeitragVerfasst: 22.06.2008, 20:16 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
Schonmal einen kompletten rebuild vom Projekt versucht?
Weil da muss irgendwas kaputt sein, wenn du nichtmal in die funktion reinspringen kannst und der pointer wirklich in ordnung ist.

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
BeitragVerfasst: 23.06.2008, 17:27 
Offline
Benutzeravatar

Registriert: 21.06.2008, 20:00
Beiträge: 8
Ein Rebuild hilft leider auch nichts.

Ich habe testweise mal probiert, das Problem zu umgehen, indem ich die Texturen vorher lade und dann an der entsprechenden Stelle mit findTexture darauf zuzugreifen. Dabei tritt genau der selbe Fehler auf :? D.h. das laden vorher geht einwandfrei, jetzt tritt der Fehler bei driver->findTexture auf...

Der Pointer muss schon deswegen in Ordnung sein, weil ja die update-Schleife mit driver->beginScene hinten dran einwandfrei ausgeführt wird.

Falls jemand von euch die Muße haben sollte, es bei sich mal ausprobiern zu wollen, habe ich mal das Projekt hochgeladen:
http://www.drag-on.xail.net/IrrlichtGame.zip
Die Stelle mit dem Fehler ist markiert. Viel mehr als ich oben schon gepostet habe, ist sowieso nicht drin.

EDIT:
Mir ist da noch ne Idee gekommen, woran der Fehler liegen könnte:
Wenn man so eine Textur lädt:
Code:
ITexture *texture = driver->getTexture("Textures/Wood.tga");

Muss man sie dann selbst per delete wieder löschen, oder macht die Irrlicht-Engine da irgendwas? Ich habe die Texturen nämlich manuell wieder gelöscht, wenn aber Irrlicht da vorher schon was gelöscht hat, zerschieß ich mir dabei natürlich den Speicher...

Drag-On


Nach oben
 Profil  
 
BeitragVerfasst: 26.06.2008, 21:39 
Offline
Benutzeravatar

Registriert: 21.06.2008, 20:00
Beiträge: 8
Sorry für den Doppelpost, aber meinen Edit hat ja niemand gesehen :D

Die Lösung war tatsächlich, dass man die Texturobjekte nicht selbst aus dem Speicher löschen darf. Offenbar löscht die Engine die Textur selbstständig wenn sie nicht mehr verwendet wird.

Nur, falls nochmal jemand das selbe Problem haben sollte ;)

Drag-On


Nach oben
 Profil  
 
BeitragVerfasst: 26.06.2008, 22:21 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
siehe auch documentation zu IReferenceCounted::drop()
Nur bei objekten anwenden die mit 'create'blabla erzeugt wurden.

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 15 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de