我该如何使用SDL2 iOS应用程序事件?

我该如何使用SDL2 iOS应用程序事件?,第1张

概述我目前正在使用SDL2 Library和C编写一个iPhone应用程序,而且大部分内容都很顺利.不幸的是,文档似乎在某些方面相当薄,特别是iOS特定的功能.我是使用SDL2的新手,这让事情变得非常困难.到目前为止,一切都有效,但我对一个问题感到难过. SDL2定义了六种专门用于移动应用程序的事件类型. README-ios.txt文件描述了它们并使用它们: int HandleAppEvents( 我目前正在使用SDL2 library和C编写一个iPhone应用程序,而且大部分内容都很顺利.不幸的是,文档似乎在某些方面相当薄,特别是iOS特定的功能.我是使用SDL2的新手,这让事情变得非常困难.到目前为止,一切都有效,但我对一个问题感到难过. SDL2定义了六种专门用于移动应用程序的事件类型. README-ios.txt文件描述了它们并使用它们:
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;}

我对这段代码有几个问题.

SDL_SetEventFilter()有什么作用?我阅读了SDL Wiki页面,看起来特别含糊.

实际上,HandleAppEvents()函数如何工作?例如,如果我有这样的代码:

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

例如,当我收到SDL_APP_WILLENTERBACKGROUND时,应该在HandleAppEvents()或main()中放置什么样的代码来销毁内存或停止我的游戏循环?

假设tex2是可消耗的,如果应用程序收到SDL_APP_LOWMEMORY,则可以将其删除.如何在不弄乱其他数据的情况下从HandleAppEvents()中删除tex2?

userdata指针中有什么?

当我的应用程序进入后台时,我应该将纹理转换为曲面,并将它们作为bmps保存在../tmp/目录中,还是当应用程序回到前台时它们仍然在内存中?

我希望我的混乱问题有某种意义.如果有一个地方我可以找到SDL2的全面文档,那就太棒了.

谢谢参观!

解决方法 SDL_SetEventFilter是一种“领先于”SDL事件队列的方法.在将它们放入队列之前,您基本上可以获得接收到的事件,而在iOS情况下,您必须立即对它们做出反应.

这背后的技术原因是,对于这些类型的消息,iOS使用一系列回调,SDL为您提供并包装,以便尽可能无缝地实现跨平台体验,但事实仍然是iOS仍然期望您在从回调返回之前对他们采取行动.

因此,例如,如果我们只是将系统内存系统较低的消息放在队列中,而不是通过此机制将其直接传递给应用程序,并且在该事件通过队列之前您什么也不做,则轮询它等,iOS可以强制关闭您的应用程序,因为它不会按预期运行.

当应用程序转到后台时,您无需保存纹理. iOS会为你做这件事,如果它没有足够的内存来执行此 *** 作,它只会杀死你的应用程序(你不会松开GL ES / ES2上下文,这可能会在某些AndroID设备上发生).

userdata指针将包含作为第二个参数传递给SDL_SetEventFilter的数据,因此如果使用SDL_SetEventFilter(HandleAppEvents,NulL),则userdata将为NulL.

在SDL_APP_WILLENTERBACKGROUND,如果我没记错的话,你不需要做任何事情.我有一段时间没有启动我的iOS应用程序,但我认为SDL自己处理其所有内部状态(包括阻止事件循环然后重新启动它).你必须自己处理的事件是SDL_APP_LOWMEMORY和SDL_APP_TERMINATING,你如何处理这是应用程序特定的(删除纹理,可用内存等,它超出了SDL专门)

总结

以上是内存溢出为你收集整理的我该如何使用SDL2 iOS应用程序事件?全部内容,希望文章能够帮你解决我该如何使用SDL2 iOS应用程序事件?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1109528.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存