2012/08/17

SBL_PollEventの実装を解析

結論から言ってしまうとSBL_PollEventの中身は通常のWin32アプリケーションで実装されるメッセージポンプと同様の処理を行うSDL_PumpEventsとメッセージキューに貯まっているウィンドウズメッセージを横取りするSBL_PeepEventsによって実装されています。

SDL_PumpEventsの実装を辿っていくと最終的に次のコードが見つかります。
これは典型的なメッセージポンプ処理の実装です。

[cpp]
// SDL_dibevents.c
void DIB_PumpEvents(_THIS)
{
MSG msg;

while ( PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) ) {
if ( GetMessage(&msg, NULL, 0, 0) > 0 ) {
DispatchMessage(&msg);
}
}

if ( SDL_GetAppState() & SDL_APPMOUSEFOCUS ) {
DIB_GenerateMouseMotionEvent( this );
}
}
[/cpp]

SBL_PeepEventの実装を辿っていくと「SBLが管理しているイベントキューの中にある全てのイベント種類の中から最初の1つを取得する」という動作を行います。取得したイベントはSDL_CutEventが呼び出され、メッセージキューから消えます。



余談ですが、spot=(spot+1)%MAXEVENTの式があり、MAXEVENTS=128の指定のため、おそらくSDLのイベントキューのサイズは128だろうと推測する。

0 件のコメント:

コメントを投稿