SDL2 SDL_SetEventFilter与SDL_WaitEvent

时间:2017-10-22 01:32:18

标签: sdl sdl-2

我有一个典型的SDL事件循环调用SDL_WaitEvent,并遇到了一个讨论很多的问题(请参阅herehere),我的应用程序在此期间无法重新绘制调整大小,因为SDL_WaitEvent在某些平台(Win32和Mac OS)上完成调整大小之前不会返回。在每个讨论中,提到了使用SDL_SetEventFilter来解决它的技术,并且或多或少地接受了解决方案和黑客攻击。

使用SDL_SetEventFilter方法非常有效,但现在我正在查看我的代码,并且几乎将我SDL_WaitEvent中的所有代码移动到我的EventFilter中,只是处理事件那里。

在建筑上,它很可疑。

除了在单独的线程上调用的可能性之外,是否有任何问题可以通过SDL_SetEventFilter在我的应用程序中向我的应用程序发送消息?

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

1 个答案:

答案 0 :(得分:1)

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

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。