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.

Reply via email to