我有一个典型的SDL事件循环调用SDL_WaitEvent
,并遇到了一个讨论很多的问题(请参阅here和here),我的应用程序在此期间无法重新绘制调整大小,因为SDL_WaitEvent
在某些平台(Win32和Mac OS)上完成调整大小之前不会返回。在每个讨论中,提到了使用SDL_SetEventFilter
来解决它的技术,并且或多或少地接受了解决方案和黑客攻击。
使用SDL_SetEventFilter
方法非常有效,但现在我正在查看我的代码,并且几乎将我SDL_WaitEvent
中的所有代码移动到我的EventFilter中,只是处理事件那里。
在建筑上,它很可疑。
除了在单独的线程上调用的可能性之外,是否有任何问题可以通过SDL_SetEventFilter
在我的应用程序中向我的应用程序发送消息?
奖金问题:SDL如何在内部处理此问题?据我所知,这个调整大小的问题植根于底层平台。例如,Win32将发出WM_SIZING,然后输入自己的内部消息泵,直到发出WM_SIZE。什么是触发SDL EventFilter运行?
答案 0 :(得分:1)
经过更多的实验和筛选来源后回答我自己的问题。
SDL处理事件的方式是,当您致电SDL_WaitEvent
/ SDL_PeekEvent
/ SDL_PeepEvents
时,它会输出win32,直到没有消息为止。在该泵期间,它将处理win32消息并将其转换为排队的SDL事件,以便在泵完成后返回。
win32处理移动/调整大小操作的方式是进入消息泵,直到移动/调整大小完成。这是一个常规的消息泵,因此在此期间仍会调用您的WndProc。您将收到WM_ENTERSIZEMOVE
,然后收到许多WM_SIZING
或WM_MOVING
条消息,最后收到WM_EXITSIZEMOVE
。
这两个因素结合在一起意味着当你调用任何SDL事件函数并且win32执行移动/调整大小操作时,你会被拖延直到拖动完成。
EventFilter绕过它的方式是它作为WndProc本身的一部分被调用。这意味着您不需要将消息排队并在SDL_Peek / Wait / Peep事件结束时将消息传递给您。作为抽水的一部分,你会立即将它们交给你。
在我的架构中,这非常适合。 YMMV。