|
JLI Spieleprogrammierung
|
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
|
Verfasst am: 16.01.2006, 21:34 Titel: Texturen wieder aus dem Ressourcen Manager entfernen |
|
|
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 )
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 |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 16.01.2006, 21:38 Titel: |
|
|
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 |
|
|
PeaceKiller JLI Master
Alter: 36 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 16.01.2006, 21:42 Titel: |
|
|
Du musst nicht zweimal posten damit man dich beachtet
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 |
|
|
RayJunx JLI'ler
Alter: 43 Anmeldedatum: 16.01.2006 Beiträge: 130 Wohnort: Bayern Medaillen: Keine
|
Verfasst am: 16.01.2006, 21:52 Titel: tausend millionen dank |
|
|
sorry für das doppelposten
hatte das geantortet und dann mein eigenes topic nicht wiedergefunden
und dann...das übliche..doppelthältbesser verhalten 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 |
|
|
PeaceKiller JLI Master
Alter: 36 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 16.01.2006, 22:08 Titel: |
|
|
Ja, 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 |
|
|
|
|
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
|