Oh hmm, I did not know there actually was some logic implemented behind
SDL_Quit - I always though it was ignored, but apparently is not.


2014-04-08 8:48 GMT+03:00 <[email protected]>:


> Also, I'm curious if anyone has found a way to make C++ infinite main
> loops asynchronous that work across all even driven platforms? (eg.
> Emscripten, Flash, pNaCl, iOS, Android)
>

Sure, it should not be very hard, but it will naturally look different on
each platform, since the platform provides a platform-specific way to hook
into a render loop. A decent way to entrypoint into your own code is to
make your own tick() function that runs a single iteration of the
update+render loop. Then use whatever platform-specific way there is to
connect that tick() function to the system main loop. On Emscripten that is
emscripten_set_main_loop. On Flash it would be calling tick() from Stage3D
Context ENTER_FRAME event, something like
stageContext->addEventListener(flash::events::Event::ENTER_FRAME,
Function::_new(enterFrameHandler, NULL));
On iOS, you'll create a CADisplayLink object and call tick() from its
update function, see listing 4-1 "Creating and starting a display link" in

http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/WorkingwithEAGLContexts/WorkingwithEAGLContexts.html
On Android, if you're using NDK, you can create your own main thread that
spins the render loop (see e.g. the native_app_glue example in NDK) and
periodically calls tick().

In my setup, I do something slightly more complex, but effectively the
same. I further break down the tick() function:

void tick()
{
   float deltaTime = tick() - lastStoredTick;
   update(deltaTime);
   render();
}

and the basic functions that the application implements are those two:
update() advances the app simulation by the given amount of time, and
render() renders the current state of the simulation. The decoupling of
these two is because occasionally they don't go in lockstep. For example,
if the application is minimized and the screen is not visible, I may want
to update() but never render(), and on some platforms, I might want to
render() multiple times between a single update(), e.g. on Windows when you
have a windowed mode screen and drag from the corner of a window, you might
want to pause simulation for that duration and only repaint so that window
dragging is responsive and updates smoothly. Ymmv for these though.

   Jukka

-- 
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