¿Cómo debo usar los events de aplicaciones iOS SDL2?

Actualmente estoy usando la biblioteca SDL2 y C para escribir una aplicación de iPhone, y las cosas han estado funcionando bien en su mayor parte. Desafortunadamente, la documentation parece ser bastante delgada en algunas áreas, especialmente funciones específicas de iOS. Soy nuevo en el uso de SDL2, y esto dificulta las cosas. Hasta ahora, todo ha funcionado, pero estoy perplejo con un problema. SDL2 define seis types de events para ser usados ​​específicamente para aplicaciones mobilees. El file README-ios.txt los describe y los utiliza como tales:

int HandleAppEvents(void *userdata, SDL_Event *event) { switch (event->type) { case SDL_APP_TERMINATING: /* Terminate the app. Shut everything down before returning from this function. */ return 0; case SDL_APP_LOWMEMORY: /* You will get this when your app is paused and iOS wants more memory. Release as much memory as possible. */ return 0; case SDL_APP_WILLENTERBACKGROUND: /* Prepare your app to go into the background. Stop loops, etc. This gets called when the user hits the home button, or gets a call. */ return 0; case SDL_APP_DIDENTERBACKGROUND: /* This will get called if the user accepted whatever sent your app to the background. If the user got a phone call and canceled it, you'll instead get an SDL_APP_DIDENTERFOREGROUND event and restart your loops. When you get this, you have 5 seconds to save all your state or the app will be terminated. Your app is NOT active at this point. */ return 0; case SDL_APP_WILLENTERFOREGROUND: /* This call happens when your app is coming back to the foreground. Restore all your state here. */ return 0; case SDL_APP_DIDENTERFOREGROUND: /* Restart your loops here. Your app is interactive and getting CPU again. */ return 0; default: /* No special processing, add it to the event queue */ return 1; } } int main(int argc, char *argv[]) { SDL_SetEventFilter(HandleAppEvents, NULL); //... run your main loop return 0; } 

Tengo algunas preguntas sobre este código.

¿Qué hace SDL_SetEventFilter ()? Leí la página Wiki de SDL, y me pareció particularmente vaga.

En la práctica, ¿cómo funciona la function HandleAppEvents ()? Por ejemplo, si tengo un código como este:

 int main(int argc, char* argv[]) { //Initialize SDL, etc... SDL_SetEventFilter(HandleAppEvents, NULL); //I've got some SDL_Textures and windows and things... SDL_Window* my_window; SDL_Renderer* windowrend; SDL_Texture* tex1, tex2, tex3; //Primitive game loop while(game_is_running){ handle_input(); do_logic(); update_screen(); } destroy_all_my_data(); SDL_Quit(); return 0; } 

¿Qué tipo de código debería colocarse en HandleAppEvents () o main () para destruir la memory o detener el ciclo del juego cuando recibo un SDL_APP_WILLENTERBACKGROUND, por ejemplo?

Digamos que tex2 es prescindible y se puede eliminar si la aplicación recibe un SDL_APP_LOWMEMORY. ¿Cómo eliminaría tex2 de HandleAppEvents () sin jugar con otros datos?

¿Qué hay en el puntero de datos de usuario?

Cuando mi aplicación entra en segundo plano, ¿debo convertir mis texturas en superficies y savelas en el directory ../tmp/ como bmps o seguirán en memory cuando la aplicación regrese al primer plano?

Espero que mis preguntas confusas tengan algún sentido. Si hay un lugar, puedo encontrar una documentation exhaustiva para SDL2, sería genial saberlo.

¡Gracias por echar un vistazo!

SDL_SetEventFilter es una forma de "adelantarse" a la queue de events de SDL. Básicamente, obtienes los events tal como se reciben, antes de que se coloquen en la queue, y en el caso de iOS tienes que reactjsr inmediatamente.

El motivo técnico detrás de esto es que para este tipo de posts, iOS utiliza una serie de devoluciones de llamada, que SDL recibe y envuelve para que la experiencia de plataforma cruzada sea lo más fluida posible, pero sigue siendo cierto que iOS todavía espera que actuar sobre ellos antes de regresar de la callback.

Entonces, por ejemplo, si tuviéramos que poner el post de que el sistema tiene poca memory en la queue en lugar de pasarlo directamente a la aplicación a través de este mecanismo, y no hace nada hasta que ese evento pase por la queue, usted encuesta it, etc., iOS puede cerrar la aplicación de manera forzada porque no se comporta como se esperaba.

Cuando la aplicación pasa a segundo plano, no necesitas save tus texturas. iOS lo hace por ti, y si no tiene suficiente memory para hacerlo, simplemente mata tu aplicación (nunca pierdes los contexts GL ES / ES2, algo que puede suceder en ciertos dispositivos Android).

El puntero de datos de usuario va a contener los datos que pasa como el segundo parámetro para SDL_SetEventFilter, por lo que si utiliza SDL_SetEventFilter (HandleAppEvents, NULL), userdata será NULL.

En SDL_APP_WILLENTERBACKGROUND, si mal no recuerdo, no tienes que hacer nada. No he encendido mi aplicación de iOS en un time, pero creo que SDL maneja todo su estado interno (incluyendo el locking del ciclo de events y luego reiniciarlo) por sí solo. Los events que tiene que manejar usted mismo son SDL_APP_LOWMEMORY y SDL_APP_TERMINATING; sin embargo, la manera en que lo maneja es específica de la aplicación (borre texturas, memory libre, etc., va más allá de SDL específicamente)

Como aparece en este hilo , debe detener el ciclo de juego en SDL_APP_WILLENTERBACKGROUND y reanudarlo en SDL_APP_WILLENTERFOREGROUND para evitar lockings.