首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SDL2 SDL_SetEventFilter vs SDL_WaitEvent

SDL2 SDL_SetEventFilter vs SDL_WaitEvent
EN

Stack Overflow用户
提问于 2017-10-22 01:32:17
回答 1查看 991关注 0票数 2

我有一个典型的SDL事件循环调用SDL_WaitEvent,并遇到了一个备受讨论的问题(参见这里这里),在这个问题上,我的应用程序在调整大小时无法重新绘制,因为在某些平台(Win32 & Mac )上,SDL_WaitEvent不会返回。在每一次讨论中,都提到了使用SDL_SetEventFilter绕过它的技术,并或多或少地将其作为解决方案和黑客来接受。

使用SDL_SetEventFilter方法可以很好地工作,但是现在我正在查看我的代码,实际上我已经将所有的代码从我的SDL_WaitEvent中移到了我的EventFilter中,并且只处理了那里的事件。

在建筑上它是可疑的。

除了在一个单独的线程上被调用之外,这种在SDL_SetEventFilter设置的函数中向我的应用程序发送消息的方法有什么缺点吗?

附加问题: SDL如何在内部处理这个问题?据我所知,这个调整大小的问题植根于底层平台。例如,Win32将发出一个WM_SIZING,然后输入它自己的内部消息泵,直到WM_SIZE发布。是什么触发SDL EventFilter运行?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-26 20:57:02

在经过更多的实验和筛选后回答我自己的问题。

SDL处理事件的方式是,当您调用SDL_WaitEvent/SDL_PeekEvent/SDL_PeepEvents,时,它会泵出win32,直到没有消息为止。在此过程中,它将处理win32消息,并将它们转换为SDL事件,并对其进行队列,以便在泵完成后返回。

win32处理移动/调整大小操作的方式是进入消息泵,直到移动/调整大小完成为止。它是一个常规的消息泵,因此您的WndProc在此期间仍然会被调用。您将得到一个WM_ENTERSIZEMOVE,后面跟着许多WM_SIZINGWM_MOVING消息,最后是一个WM_EXITSIZEMOVE

这两件事结合在一起意味着,当您调用任何SDL事件函数而win32执行移动/调整大小操作时,您将被困在拖放完成之前。

EventFilter绕过这个问题的方式是,它作为WndProc本身的一部分被调用。这意味着您不需要在SDL_Peek/Wait/Peep事件结束时排队并将消息传递回您。作为抽水的一部分,你马上把它们交给你。

在我的建筑里,这个非常适合。YMMV

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46869687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档