Permalänk
Medlem

[C++] SDL problem!

Hej,
det är så att jag har stött på ett problem nu och jag tror jag har stirrat mig blind på koden och hittar inget fel verkar det som heller
Problemet som uppstår är att bilderna visas som jag vill att dom ska göra, men försvinner sedan helt utan anledning. (eller ja, nån anledning lär det ju finnas)

void Game::OnRender() { SDL_Rect Rect; Rect.x = 0; Rect.y = 0; Rect.w = screen.GetScreenWidth(); Rect.h = screen.GetScreenHeight(); SDL_FillRect(surf_display, &Rect, 0); switch(screen.GetCurrentScreen()) { case 0: { // Splash Screen SplashScreen splash; splash.OnRender(surf_display, &screen); break; } case 1: { // Main Menu Screen MainMenu curr_screen; curr_screen.OnRender(surf_display); break; } default: { break; } } SDL_Flip(surf_display); }

där är min renderings event kod, jag initierar spelet genom att sätta screen till 0.
screen 0 visas, sen efter 5 sekunder så byts screen till screen 1, och screen 1 visas.

SplashScreen kod:

SplashScreen::SplashScreen() { background = Graphics::OnLoad("./Data/GFX/SplashScreen.png"); } void SplashScreen::OnRender(SDL_Surface *surf_display, Screen *screen) { if(surf_display == NULL || background == NULL) { return; } Graphics::OnDraw(surf_display, background, 0, 0); if(SDL_GetTicks() < 5000) { } else { screen->MenuScreen(); } } void SplashScreen::OnCleanup() { SDL_FreeSurface(background); }

MainMenu kod:

MainMenu::MainMenu() { background = Graphics::OnLoad("./Data/GFX/MenuBackground.png"); Menu_Campaign = NULL; Menu_Tutorial = NULL; Menu_Options = NULL; Menu_Credits = NULL; Menu_Exit = NULL; } void MainMenu::OnRender(SDL_Surface *surf_display) { if(surf_display == NULL || background == NULL) { return; } Graphics::OnDraw(surf_display, background, 0, 0); } void MainMenu::OnCleanup() { SDL_FreeSurface(background); SDL_FreeSurface(Menu_Campaign); SDL_FreeSurface(Menu_Tutorial); SDL_FreeSurface(Menu_Options); SDL_FreeSurface(Menu_Credits); SDL_FreeSurface(Menu_Exit); }

Det som förbryllar mig mest är att allt verkar ju fungera bra, men sen helt "random" (skulle jag vilja säga) så blir MainMenu screen helt svart, har tagit tid på det och det är lite olika hela tiden också. Ibland 20 sekunder och ibland ända upp till 1 minut.

Använder SDL_image, SDL och SDLmain libs bara, har alla DLL:er i mappen också.

Kan det ha något att göra med processorn?

Maskinen jag sitter på är:
Intel Core2 Duo E7400 2.80GHz
4GB Ram, 64-bits Windows 7
nVidia 9800GT grafikkort

Visa signatur

C#/MonoGame Fanatiker.
Pixel Artist & Game Developer

Permalänk

Hur fungerar Graphics::OnLoad?
Håller den saker kvar i minnet eller läser den alltid från disk? För det ser ut som att du läser in grafiken varje gång du ska rita den. Anropar du verkligen MainMenu::OnCleanup? Det ser ut som ett antal potentiella minnesläckor. Du kollar ju heller inte om Graphics::OnLoad lyckas (såvida du inte använder exceptions?). Sätt en conditional breakpoint och bryt om OnLoad för menyn misslyckas. Alternativt en breakpoint i cleanupkoden för att se att den anropas så ofta som den borde.

Permalänk
Medlem
Skrivet av Antonovskij:

Hur fungerar Graphics::OnLoad?
Håller den saker kvar i minnet eller läser den alltid från disk? För det ser ut som att du läser in grafiken varje gång du ska rita den. Anropar du verkligen MainMenu::OnCleanup? Det ser ut som ett antal potentiella minnesläckor. Du kollar ju heller inte om Graphics::OnLoad lyckas (såvida du inte använder exceptions?). Sätt en conditional breakpoint och bryt om OnLoad för menyn misslyckas. Alternativt en breakpoint i cleanupkoden för att se att den anropas så ofta som den borde.

Där sa du något faktiskt...

SDL_Surface *Graphics::OnLoad(char *File) { SDL_Surface *surf_temp = NULL; SDL_Surface *surf_return = NULL; if((surf_temp = IMG_Load(File)) == NULL) { return NULL; } surf_return = SDL_DisplayFormat(surf_temp); SDL_FreeSurface(surf_temp); return surf_return; }

där är Graphics::OnLoad() iaf
antar att det är en minnesläcka nu när du säger det faktiskt

Visa signatur

C#/MonoGame Fanatiker.
Pixel Artist & Game Developer

Permalänk

Ok. Ja det ser så ut, och det kan ju fungera som förklaring till att det slutar fungera efter en viss tid, helt plötsligt får du tillbaka NULL från Graphics::OnLoad, vilket resulterar i att du inte lyckas blitta några bilder till din surf_display efter att du varje frame nollställt den med svart.

Permalänk
Medlem
Skrivet av Antonovskij:

Ok. Ja det ser så ut, och det kan ju fungera som förklaring till att det slutar fungera efter en viss tid, helt plötsligt får du tillbaka NULL från Graphics::OnLoad, vilket resulterar i att du inte lyckas blitta några bilder till din surf_display efter att du varje frame nollställt den med svart.

Verkar som jag har problem med att ladda PNG filen nu O.o

SDL_Surface *Graphics::OnLoad(char *File) { SDL_Surface *surf_temp = NULL; SDL_Surface *surf_return = NULL; if((surf_temp = IMG_Load(File)) == NULL) { printf("IMG_Load: %s\n", IMG_GetError()); return NULL; } // På denna rad får jag en // Unhandled exception at 0x68129d00 in Alpha.exe: 0xC0000005: Access violation reading location 0x0000013c. // Och jag vet att filen existerar surf_return = SDL_DisplayFormat(surf_temp); SDL_FreeSurface(surf_temp); return surf_return; }

Har Filen existerar som jag försöker ladda, har provat med att kompilera nya libs också, men får samma svar, så verkar inte vara nå fel på libsen :/

Ändrar jag filnamnet till tomt så funkar det som det ska, men så fort filen hittas så blir det krasch. Tycker det borde vara libs det är fel på då..

Visa signatur

C#/MonoGame Fanatiker.
Pixel Artist & Game Developer

Permalänk
Medlem
Skrivet av AJL:

Verkar som jag har problem med att ladda PNG filen nu O.o

SDL_Surface *Graphics::OnLoad(char *File) { SDL_Surface *surf_temp = NULL; SDL_Surface *surf_return = NULL; if((surf_temp = IMG_Load(File)) == NULL) { printf("IMG_Load: %s\n", IMG_GetError()); return NULL; } // På denna rad får jag en // Unhandled exception at 0x68129d00 in Alpha.exe: 0xC0000005: Access violation reading location 0x0000013c. // Och jag vet att filen existerar surf_return = SDL_DisplayFormat(surf_temp); SDL_FreeSurface(surf_temp); return surf_return; }

Har Filen existerar som jag försöker ladda, har provat med att kompilera nya libs också, men får samma svar, så verkar inte vara nå fel på libsen :/

Ändrar jag filnamnet till tomt så funkar det som det ska, men så fort filen hittas så blir det krasch. Tycker det borde vara libs det är fel på då..

själva filen i sig fungerar perfekt att öppna och kolla på och så? så de inte hänt något med den.

Visa signatur

Laptop - MacBook 2.0GHz, 4GB ram, Intel GMA 950
Stationär - i5 3570k @ 4ghz, 8gb ram, 120gb ssd + 2tb hdd, Windows 8 64bit, fractal design arc
Citera så jag hittar tillbaka :)

Permalänk
Medlem
Skrivet av E_maN:

själva filen i sig fungerar perfekt att öppna och kolla på och så? så de inte hänt något med den.

Japp, har provat och kopierat filnamnet rakt av etc

Visa signatur

C#/MonoGame Fanatiker.
Pixel Artist & Game Developer

Permalänk

Låter konstigt. Är du säker på att du har rätt working directory inställd (om du sitter i någon IDE)? Fungerar det om du startar genom att starta programmet utanför IDE:t? Kan du öppna andra filer ifrån programmet med fopen eller std::ifstream?

Permalänk
Medlem

haha nu har man gjort bort sig allt, spenderat 2 timmar på att koda om allt, visade sig att jag gjort ett litet nybörjar misstag. hade lyckats röra ihop koden så att jag försökte ladda filen och köra SDL_DisplayFormat();
utan att ha initialiserat SDL_Init().

Är huvudet dumt, får folk på internet lida hehe
Tack iaf!

Visa signatur

C#/MonoGame Fanatiker.
Pixel Artist & Game Developer

Permalänk
Medlem
Skrivet av AJL:

haha nu har man gjort bort sig allt, spenderat 2 timmar på att koda om allt, visade sig att jag gjort ett litet nybörjar misstag. hade lyckats röra ihop koden så att jag försökte ladda filen och köra SDL_DisplayFormat();
utan att ha initialiserat SDL_Init().

Är huvudet dumt, får folk på internet lida hehe
Tack iaf!

SDL har ingen felmeddelandeshantering du kan visa i ett konsollfönster eller logga? brukar underlätta

Visa signatur

Laptop - MacBook 2.0GHz, 4GB ram, Intel GMA 950
Stationär - i5 3570k @ 4ghz, 8gb ram, 120gb ssd + 2tb hdd, Windows 8 64bit, fractal design arc
Citera så jag hittar tillbaka :)

Permalänk
Medlem
Skrivet av E_maN:

SDL har ingen felmeddelandeshantering du kan visa i ett konsollfönster eller logga? brukar underlätta

jo, men tänkte inte på det hehe ^^
SDL_GetError();
ska tydligen finnas IMG_GetError(); för SDL_image libbet också

Visa signatur

C#/MonoGame Fanatiker.
Pixel Artist & Game Developer

Permalänk
Medlem

Sedan, vad skall "SDL_GetTicks() < 5000" göra? SDL_GetTicks blir bara under 5000 en tills räknaren nått högre värde, sedan aldrig igen, man kan spara undan gamla värdet & subtrahera med nya...