JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

kleines Speicherproblem

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
schneidi74
Senior JLI'ler



Anmeldedatum: 14.05.2004
Beiträge: 243

Medaillen: Keine

BeitragVerfasst am: 14.07.2004, 19:08    Titel: kleines Speicherproblem Antworten mit Zitat

Mahlzeit,

ich hab ein kleines Programm geschrieben, was einfach nur eine Grafik läd und auf dem Bildschirm ausgibt.

Wenn ich das "Programm" ausführe und mir die ganze Sache z.B. im Taskmanager angucke, steigt dort ohne Unterbrechung die Speicherauslastung für das Programm an.

Was mache ich verkehrt?
_________________
-+- SchNeiDi74 -+-
-+- www.creative-games.de -+-
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
=]Mid[=]Night[=
Super JLI'ler



Anmeldedatum: 20.11.2002
Beiträge: 380
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 14.07.2004, 19:14    Titel: Antworten mit Zitat

sry aber wann kapieren die leute mal, dass ein bisschen code nicht schaden kann ?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 14.07.2004, 19:24    Titel: Antworten mit Zitat

Vermutlich lädst du in der Programmschleife immer wieder das Bild ohne es zu behalten oder wieder frei zu geben. Aber wie mein Vorgänger sagte kann man das ohne Code nicht konkret sagen.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Samus_Aran
JLI'ler


Alter: 37
Anmeldedatum: 12.05.2004
Beiträge: 183
Wohnort: Plauen->des liegt in Sachsen in der nähe von Chemnitz und Zwickau
Medaillen: Keine

BeitragVerfasst am: 15.07.2004, 17:48    Titel: Antworten mit Zitat

Jup Fallen das glaub ich auch sowas hab ich nämlich auch mal vor Jahren fabriziert Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden MSN Messenger
schneidi74
Senior JLI'ler



Anmeldedatum: 14.05.2004
Beiträge: 243

Medaillen: Keine

BeitragVerfasst am: 15.07.2004, 17:53    Titel: Antworten mit Zitat

OK, Ihr habt's so gewollt Cool
Code:

CBackground::CBackground()
{
   m_lpDevice = NULL;
   m_lpSurface = NULL;
   m_lpBackBuffer = NULL;
}

CBackground::~CBackground()
{
   CleanUp();
}

void CBackground::DrawBackground(LPDIRECT3DDEVICE9 lpDevice,LPDIRECT3DSURFACE9 lpSurface, LPDIRECT3DSURFACE9 lpBackBuffer)
{
   m_lpDevice      = lpDevice;
   m_lpSurface      = lpSurface;
   m_lpBackBuffer   = lpBackBuffer;

   RECT r = { 0, 300, 600, 428 };

   D3DXLoadSurfaceFromFile(m_lpSurface,
                          NULL,
                     &r,
                     FILE,
                     NULL,
                     D3DX_DEFAULT,
                     0,
                     NULL);

   RECT DestRect = { 0, 0, 1024, 768 };

   m_lpDevice->StretchRect(m_lpSurface,
                        NULL,
                    m_lpBackBuffer,
                    &DestRect,
                    D3DTEXF_NONE);

}

void CBackground::CleanUp(void)
{
   if(NULL != m_lpBackBuffer)
   {
      m_lpBackBuffer->Release();
      m_lpBackBuffer = NULL;
   }

   if(NULL != m_lpSurface)
   {
      m_lpSurface->Release();
      m_lpSurface = NULL;
   }

   if(NULL != m_lpDevice)
   {
      m_lpDevice->Release();
      m_lpDevice = NULL;
   }
}


Ich hab da auch nochmal rumgetüfftelt. Wenn ich die ganze Schose außerhalb der Spielschleife aufrufe klappts. Aber das ist ja eigentlich nicht wirklich sinnvoll, da ich den speicher ja belege, bevor ich ihn eigentlich brauche, wenn ihr versteht was ich meine.
_________________
-+- SchNeiDi74 -+-
-+- www.creative-games.de -+-
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 15.07.2004, 19:36    Titel: Antworten mit Zitat

Da siehst dus doch! Du lädst die Grafik bei jedem durchgang, und gibts sie danach nicht wieder frei. Beim Clean Up löschst du nur die letzte Grafik, die schätzungsweise 2000 anderen male blockieren weiterhin den Speicher!
Also entweder du Released die Grafik nach dem kopieren auch wieder, oder du lädst sie in einer init-Funktion, was weitaus besser wäre!
Das mit dem laden, bevor man sie bracuht: Was glaubst du wohl, warum bei ungefähr jedem Spiel ein Ladebildschirm kommt? Wenn mans in jeder Schleife lädt, ist das viel viel langsamer. Also lad die Grafik einmal richtig und dann nie wieder!
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
schneidi74
Senior JLI'ler



Anmeldedatum: 14.05.2004
Beiträge: 243

Medaillen: Keine

BeitragVerfasst am: 16.07.2004, 06:44    Titel: Antworten mit Zitat

OK, das hab ich verstanden.

Aber da hab ich doch dann gleich die nächste Frage.

Ich habe in meinem hauptprogrammteil ja die Spielschleife, wo ich dann sage wenn game_part = 1 ist intro, game_part = 2 ist Menü, game_part = 3 ist spiel

Diese if Abfrage ist ja in der Spielschleife drin. Wenn ich die Grafik aber vorher lade, habe ich die Grafiken ja schon geladen, wenn ich beispielsweise erst im Menüpart bin.

Wie stelle ich es an, dass ich wirklich erst die grafiken lade, wenn's an den Spielpart geht, und diese dann auch nur 1mal lade?
_________________
-+- SchNeiDi74 -+-
-+- www.creative-games.de -+-
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
HotAcid
Super JLI'ler


Alter: 43
Anmeldedatum: 04.08.2002
Beiträge: 372
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 16.07.2004, 07:15    Titel: Antworten mit Zitat

mach dir doch ne Funktion "loadGfx()", in der du alle Grafiken lädst und die du erst dann aufrufst, wenn das erste Mal auf game_part3 geschaltet wird

cu Felix
_________________
StGB §§ 328 Abs. 2 Pkt 3:
Mit Freiheitsstrafe bis zu fünf Jahren oder mit Geldstrafe wird bestraft, wer eine nukleare Explosion verursacht.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
schneidi74
Senior JLI'ler



Anmeldedatum: 14.05.2004
Beiträge: 243

Medaillen: Keine

BeitragVerfasst am: 16.07.2004, 07:35    Titel: Antworten mit Zitat

Ja aber würde ich das dann nicht auch in der Spielschleife machen und hätte das gleiche Problem wie vorher, dass ich dutzendmal die Grafiken laden würde?!
_________________
-+- SchNeiDi74 -+-
-+- www.creative-games.de -+-
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
=]Mid[=]Night[=
Super JLI'ler



Anmeldedatum: 20.11.2002
Beiträge: 380
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 16.07.2004, 08:01    Titel: Antworten mit Zitat

du musst halt die bedingung so machen, dass die grafiken nur 1mal geladen werden oder einfach alle grafiken direkt beim starten des programms laden
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sec
Junior JLI'ler



Anmeldedatum: 18.09.2002
Beiträge: 88

Medaillen: Keine

BeitragVerfasst am: 16.07.2004, 08:14    Titel: Antworten mit Zitat

Code:

BOOL Loaded = FALSE; // Muss Global sein

...
...
// In der Spieleschleife
if(GamePart == 1)
{
          if(Loaded == FALSE)
          {
               //Grafiken Laden
             
               Loaded = TRUE;
          }
}

_________________
MFG Sec
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
schneidi74
Senior JLI'ler



Anmeldedatum: 14.05.2004
Beiträge: 243

Medaillen: Keine

BeitragVerfasst am: 16.07.2004, 08:39    Titel: Antworten mit Zitat

Ja logisch... manchmal braucht man nur einen Denkanstoß! Herzlichen dank!
_________________
-+- SchNeiDi74 -+-
-+- www.creative-games.de -+-
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 16.07.2004, 12:06    Titel: Antworten mit Zitat

Du kannst auch eine extra Funktion machen:
Code:

Load Game()
{
Grafiken laden;
Spielstatus auf "Game setzten";
}

Dann bräcuhtest du auch noch einen Funktion Unlaod Game, die die Grafiken wieder freigibt:
Code:

//Status ändern
switch(Satuts)
{
case 1:
Unload Intro;
break;
case 2:
unload Game;
usdw.
}
LoadGame();
//oder eben irgendwetwas anderes!

oder du lädst alle Grafiken zu beginn des proghramms einmal, dann hat man keine ladezeiten, wenn man vom Menü ins Spiel und wieder zurück wechselt.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
schneidi74
Senior JLI'ler



Anmeldedatum: 14.05.2004
Beiträge: 243

Medaillen: Keine

BeitragVerfasst am: 16.07.2004, 13:02    Titel: Antworten mit Zitat

Jo, das hört sich gut an. Das werde ich am Wochenende mal versuchen einzubauen. Auf die Art und weise könnte man ja auch sowas wie einen Ladebild machen währen die ganzen Grafiken geladen werden. Gar nicht schlecht.

Danke für eure ganzen Tips!
_________________
-+- SchNeiDi74 -+-
-+- www.creative-games.de -+-
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik 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