Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
schneidi74 Senior JLI'ler
Anmeldedatum: 14.05.2004 Beiträge: 243
Medaillen: Keine
|
Verfasst am: 14.07.2004, 19:08 Titel: kleines Speicherproblem |
|
|
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 |
|
|
=]Mid[=]Night[= Super JLI'ler
Anmeldedatum: 20.11.2002 Beiträge: 380 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 14.07.2004, 19:14 Titel: |
|
|
sry aber wann kapieren die leute mal, dass ein bisschen code nicht schaden kann ? |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 14.07.2004, 19:24 Titel: |
|
|
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 |
|
|
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
|
Verfasst am: 15.07.2004, 17:48 Titel: |
|
|
Jup Fallen das glaub ich auch sowas hab ich nämlich auch mal vor Jahren fabriziert |
|
Nach oben |
|
|
schneidi74 Senior JLI'ler
Anmeldedatum: 14.05.2004 Beiträge: 243
Medaillen: Keine
|
Verfasst am: 15.07.2004, 17:53 Titel: |
|
|
OK, Ihr habt's so gewollt
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 |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 15.07.2004, 19:36 Titel: |
|
|
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 |
|
|
schneidi74 Senior JLI'ler
Anmeldedatum: 14.05.2004 Beiträge: 243
Medaillen: Keine
|
Verfasst am: 16.07.2004, 06:44 Titel: |
|
|
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 |
|
|
HotAcid Super JLI'ler
Alter: 43 Anmeldedatum: 04.08.2002 Beiträge: 372 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 16.07.2004, 07:15 Titel: |
|
|
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 |
|
|
schneidi74 Senior JLI'ler
Anmeldedatum: 14.05.2004 Beiträge: 243
Medaillen: Keine
|
Verfasst am: 16.07.2004, 07:35 Titel: |
|
|
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 |
|
|
=]Mid[=]Night[= Super JLI'ler
Anmeldedatum: 20.11.2002 Beiträge: 380 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 16.07.2004, 08:01 Titel: |
|
|
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 |
|
|
Sec Junior JLI'ler
Anmeldedatum: 18.09.2002 Beiträge: 88
Medaillen: Keine
|
Verfasst am: 16.07.2004, 08:14 Titel: |
|
|
Code: |
BOOL Loaded = FALSE; // Muss Global sein
...
...
// In der Spieleschleife
if(GamePart == 1)
{
if(Loaded == FALSE)
{
//Grafiken Laden
Loaded = TRUE;
}
} |
_________________ MFG Sec |
|
Nach oben |
|
|
schneidi74 Senior JLI'ler
Anmeldedatum: 14.05.2004 Beiträge: 243
Medaillen: Keine
|
Verfasst am: 16.07.2004, 08:39 Titel: |
|
|
Ja logisch... manchmal braucht man nur einen Denkanstoß! Herzlichen dank! _________________ -+- SchNeiDi74 -+-
-+- www.creative-games.de -+- |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 16.07.2004, 12:06 Titel: |
|
|
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 |
|
|
schneidi74 Senior JLI'ler
Anmeldedatum: 14.05.2004 Beiträge: 243
Medaillen: Keine
|
Verfasst am: 16.07.2004, 13:02 Titel: |
|
|
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 |
|
|
|