Looks like that code is calling SDL_Init and InitVideo in each frame? That is going to be slow, and also allocates memory which is not freed without SDL_Quit.
You should do init once, before calling the main loop function. - Alon On Sun, Apr 6, 2014 at 4:43 PM, <[email protected]> wrote: > > <https://lh6.googleusercontent.com/-K5u_LGOXmLk/U0HjTLBYVtI/AAAAAAAAAAc/LJ-fIy-Rqo4/s1600/cannot+enlarge+memory.JPG> > Thanks for the help. I'm not sure if I really fixed the issue or just > created a more dominant one. > From running the new generated page I get* "Cannot enlarge memory arrays. > Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current > value 16777216, (2) compile with ALLOW_MEMORY_GROWTH which adjusts the size > at runtime but prevents some optimizations, or (3) set Module.TOTAL_MEMORY > before the program runs."* > > Also, here's what my code looks like now. > > > #include <stdlib.h> >> #include <SDL/SDL.h> >> #include <emscripten.h> >> >> void renderStuff() { >> SDL_Init( SDL_INIT_VIDEO ); >> >> SDL_Surface* bitmap = SDL_LoadBMP("bat.bmp"); >> SDL_Surface* screen = SDL_SetVideoMode( 640, 480, 0, >> SDL_HWSURFACE | SDL_DOUBLEBUF ); >> >> >> // Part of the bitmap that we want to draw >> SDL_Rect source; >> source.x = 24; >> source.y = 63; >> source.w = 65; >> source.h = 44; >> >> // Part of the screen we want to draw the sprite to >> SDL_Rect destination; >> destination.x = 100; >> destination.y = 100; >> destination.w = 65; >> destination.h = 44; >> >> SDL_BlitSurface(bitmap, &source, screen, &destination); >> >> SDL_Flip(screen); >> } >> >> void one_iter() { >> >> >> >> SDL_Event event; >> bool gameRunning = true; >> >> >> if (SDL_PollEvent(&event)) >> { >> if (event.type == SDL_QUIT) >> { >> gameRunning = false; >> } >> } >> >> renderStuff(); >> >> >> } >> >> int main(int argc, char **argv) >> { >> >> emscripten_set_main_loop(one_iter, 60, 1); >> >> return 0; >> } >> >> Now, I imagine it's trying to take an unusual amount of memory for the > type of things it's intended to do but the browser won't let it so > everything runs good. However using the browser to fix my bug is obviously > the kind of thing that will backfire sooner or later. So now I'm wondering > what is causing it to attempt to take up more memory than it needs and if > the unresponsive script issue really went away or is just not able to > manifest on account of the newer issue. > > > On Sunday, April 6, 2014 1:56:33 PM UTC-5, Dave Nicponski wrote: >> >> I've not used SDL, but aren't you grabbing control of the event loop here >> in your while(gameRunning) { } loop? Each main loop invocation is >> happening in the browser's (single) UI thread. If you don't return control >> to the browser (by exiting the one_iter() function) then the browser will >> freeze. >> >> Maybe try structuring your code like this: >> >> void oneIter() { >> // Stuff currently inside your while() { } block >> if (!gameRunning) { >> // Stuff currently after your while() { } block, like SDLQuit() and >> friends >> } >> } >> >> int main() { >> // Setup code, stuff currently before your while() { } block >> emscripten_set_main_loop(); >> } >> >> >> Now the oneIter() function will be invoked by the browser in a loop, >> yielding back to the browser each loop iteration. >> >> -dave- >> >> On Sunday, April 6, 2014 12:49:51 AM UTC-4, [email protected] wrote: >>> >>> >>> <https://lh3.googleusercontent.com/-FrjglpaDPRs/U0DZZ1cTn9I/AAAAAAAAAAQ/29x4jM-0S_s/s1600/unresponsive%2Bscript3.JPG> >>> I'm currently trying to get this tutorial I've found >>> <http://www.aaroncox.net/tutorials/2dtutorials/sdlsprites.html>on SDL >>> to work with Emscripten but I think I might be running into problems with >>> the browser's event model: >>> >>> Here's the code: >>> >>> #include <SDL/SDL.h> >>>> #include <emscripten.h> >>>> >>>> const int WINDOW_WIDTH = 640; >>>> const int WINDOW_HEIGHT = 480; >>>> const char* WINDOW_TITLE = "SDL Start"; >>>> >>>> void one_iter() { >>>> SDL_Init( SDL_INIT_VIDEO ); >>>> >>>> SDL_Surface* screen = SDL_SetVideoMode( WINDOW_WIDTH, >>>> WINDOW_HEIGHT, 0, >>>> SDL_HWSURFACE | SDL_DOUBLEBUF ); >>>> SDL_WM_SetCaption( WINDOW_TITLE, 0 ); >>>> >>>> SDL_Surface* bitmap = SDL_LoadBMP("bat.bmp"); >>>> >>>> // Part of the bitmap that we want to draw >>>> SDL_Rect source; >>>> source.x = 24; >>>> source.y = 63; >>>> source.w = 65; >>>> source.h = 44; >>>> >>>> // Part of the screen we want to draw the sprite to >>>> SDL_Rect destination; >>>> destination.x = 100; >>>> destination.y = 100; >>>> destination.w = 65; >>>> destination.h = 44; >>>> >>>> SDL_Event event; >>>> bool gameRunning = true; >>>> >>>> while (gameRunning) >>>> { >>>> if (SDL_PollEvent(&event)) >>>> { >>>> if (event.type == SDL_QUIT) >>>> { >>>> gameRunning = false; >>>> } >>>> } >>>> >>>> SDL_BlitSurface(bitmap, &source, screen, &destination); >>>> >>>> SDL_Flip(screen); >>>> } >>>> >>>> SDL_FreeSurface(bitmap); >>>> >>>> SDL_Quit(); >>>> } >>>> >>>> int main(int argc, char **argv) >>>> { >>>> emscripten_set_main_loop(one_iter, 60, 1); >>>> >>>> return 0; >>>> } >>>> >>> >>> >>> I've read the Wiki on emscripten browser >>> environment<https://github.com/kripken/emscripten/wiki/Emscripten-browser-environment>so >>> I figured I had to use *emscripten_set_main_loop >>> *to make SDL_Quit() work and give control back to the browser and keep >>> it from freaking out. But as you can see it didn't work. Can anyone point >>> to me what I'm doing wrong? Any guidance here would be appreciated. >>> >> -- > You received this message because you are subscribed to the Google Groups > "emscripten-discuss" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "emscripten-discuss" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
