JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=7b411abf9b7837fd039740c19af5585aMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Texturen wieder aus dem Ressourcen Manager entfernen

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Grafik und Sound
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
RayJunx
JLI'ler


Alter: 43
Anmeldedatum: 16.01.2006
Beiträge: 130
Wohnort: Bayern
Medaillen: Keine

BeitragVerfasst am: 16.01.2006, 21:34    Titel: Texturen wieder aus dem Ressourcen Manager entfernen Antworten mit Zitat

Habe die Ehre,
habe ein Problem. Verwendete die RessourcenManager Klasse aus dem Buch dieser Seite als Verwalter für die Sprite Ressourcen. Geht auch wunderbar. Nur würde ich gerne während des Programmablaufes Texturen wieder entfernen damit ich Platz für neue auf meiner Grafikkarte habe ( Große fette endgegner animieren die danach nie wieder gebraucht werden Very Happy )
Wie mach ich das? anbei der Codeauszug der RessourcenManager Klasse. Ansich könnte man da jetzt sicher leicht ergänzen welche Klassenfunktion noch fehlt und wie sie im detail aussieht, wenn man sich denn damit auskennen würde. Kann mir jemand helfen?

Gruß, RayJunx

CPP:
#include "ResourceManager.h"
#include "global.h"

// Konstruktor - Initialisierungen
CResourceManager::CResourceManager()
{
    m_lpD3DDevice = NULL;
}

// Destruktor - Freigabe der Texturen aus der Map
CResourceManager::~CResourceManager()
{
   map<string,LPDIRECT3DTEXTURE9>::iterator it;

   for(it = m_MapTextures.begin(); it != m_MapTextures.end();it++)
   {
        (it->second)->Release();
   }
}

// Initialisierung des Ressourcenmanagers
void CResourceManager::Init(LPDIRECT3DDEVICE9 lpD3DDevice)
{
    m_lpD3DDevice = lpD3DDevice;
}


// Textur suchen und ggf. zurückgeben
LPDIRECT3DTEXTURE9 CResourceManager::GetTexture(LPCSTR lpTextureName)
{
    // Iterator für die Suche in der Map
    map<string,LPDIRECT3DTEXTURE9>::iterator result;

    // Nach dem Namen der Textur suchen
    result = m_MapTextures.find(lpTextureName);

    // wenn der Name nicht in der Map vorhanden ist
    // NULL zurückgeben
    if(result == m_MapTextures.end())
    {
        return NULL;
    }

    // sonst den Zeiger auf die Textur zurückgeben
    return result->second;
}

// Textur hinzufügen
void CResourceManager::AddTexture(LPCSTR lpFileName)
{
    // testen, ob die Textur bereits vorhanden ist
    LPDIRECT3DTEXTURE9 lpTexture = GetTexture(lpFileName);

    // wenn sie nicht vorhanden ist, wird sie wie
    // gewohnt erzeugt
    if(!lpTexture)
    {
        D3DXIMAGE_INFO ImageInfo;
        D3DXGetImageInfoFromFile(lpFileName,&ImageInfo);

        D3DXCreateTextureFromFileEx(m_lpD3DDevice,
                                    lpFileName,
                                    ImageInfo.Width,
                                    ImageInfo.Height,
                                    1,0,
                                    D3DFMT_UNKNOWN,
                                    D3DPOOL_MANAGED,
                                    D3DX_FILTER_NONE,
                                    D3DX_FILTER_NONE,
                                    0,0,0,
                                    &lpTexture);

        // und in die Map unter ihrem Namen eingefügt
        m_MapTextures[lpFileName] = lpTexture;
    }
}



EDIT(Kampfhund): code- durch cpp-Tags ersetzt.
_________________
Just a Freak
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 16.01.2006, 21:38    Titel: Antworten mit Zitat

Du benutzt std::map<T>. Dieser Kontainer hat die Funktion find welche Dir den Iterator auf das gefundene Objekt wiedergibt, ansonsten 0.

Dann löschst Du diesen iterator mit erase und setzt mit dem Rückgabewert den euen Iterator. Nicht vergessen vor dem Löschen Release vom COM-Objekt aufzurufen, sonst bekommst Du MemoryLeaks in der Größe von Australien.
_________________
'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
PeaceKiller
JLI Master


Alter: 36
Anmeldedatum: 28.11.2002
Beiträge: 970

Medaillen: Keine

BeitragVerfasst am: 16.01.2006, 21:42    Titel: Antworten mit Zitat

Du musst nicht zweimal posten damit man dich beachtet Wink

CPP:
bool CResourceManager::DeleteTexture(LPCSTR lpTextureName)
{
LPDIRECT3DTEXTURE9 temp = GetTexture(lpTextureName);
if(!temp)
   return false;

temp->Release();

MapTextures.erase(m_MapTextures.find(lpTextureName));

}


Zwar etwas unsauber, sollte aber funktionieren.
_________________
»If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
RayJunx
JLI'ler


Alter: 43
Anmeldedatum: 16.01.2006
Beiträge: 130
Wohnort: Bayern
Medaillen: Keine

BeitragVerfasst am: 16.01.2006, 21:52    Titel: tausend millionen dank Antworten mit Zitat

sorry für das doppelposten
hatte das geantortet und dann mein eigenes topic nicht wiedergefunden
und dann...das übliche..doppelthältbesser verhalten Wink tut leid

aber danke für den quellcode eben!
genau das hab ich gesucht wird gleich morgen eingebaut.
nur eine frage noch.
weil eins weiter oben was von COM berücksichtigen die rede war,
wegen memory leaks. krieg ich die mit dem vorschlag von dir
nicht? oder muß ich dann noch was berücksichtigen?

vielen dank nochmal!
Rayjunx
_________________
Just a Freak
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
PeaceKiller
JLI Master


Alter: 36
Anmeldedatum: 28.11.2002
Beiträge: 970

Medaillen: Keine

BeitragVerfasst am: 16.01.2006, 22:08    Titel: Antworten mit Zitat

Ja,
CPP:
temp->Release();
gibt das Com-Objekt frei.
_________________
»If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Grafik und Sound Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum