Mingw+SDL移植須知:不要嘗試在Windows上用線程解析事件!

歡迎訪問http://omegacoleman.sinaapp.com/ shell

=========== app


最近在弄SDL,在Linux(fc17)下完成開發後,準備用mingw移植到Windows平臺。相比在Windows下用mingw編譯,其實有更好的方案:在Linux上直接使用mingw交叉編譯,方法以下:
-沒安裝mingw32-gcc的,用包管理器安裝。我這裏是: 異步


yum install mingw32-gcc

-而後,運行i686-w64-mingw32-gcc,就像在運行gcc同樣進行編譯。使用SDL時建議加上 -lmingw32,最後,命令應該是這樣:



i686-w64-mingw32-gcc ….c -o ….exe -lSDL -lSDL_image -lSDL_gfx -lmingw32 … -Wall



這個時候第一個問題出現了:gcc正確編譯的代碼被報錯了: 性能

/usr/i686-w64-mingw32/sys-root/mingw/lib/../lib/libmingw32.a(lib32_libmingw32_a-crt0_c.o):
(.text.startup+0x39): undefined reference to `WinMain@16'
collect2: error: ld returned 1 exit status



google以後,有了答案,應在有main()的文件裏面main()前插入這麼一句: ui

#undef main


這個就很奇怪了,還有更加奇怪的: google

不管是本身建立一個線程解析事件,或是使用SDL_INIT_EVENTTHREAD來達到相同的功能,在Linux下能夠正常運行,在Windows下無一例外會致使程序鎖死——僵死,死機,隨你怎麼稱呼。 spa


我花了6小時才查出這個緣由(個人美好時光TAT),不管如何改進,都不能在Windows上用線程解析事件,因此,不要嘗試在Windows上用線程解析事件 線程

我搜索到了網友eng_2005的一個提示: code

提示: Linux和BeOS支持 SDL_INIT_EVENTTHREAD,調用SDL_Init()時使用該標記將使得事件循環在另外一個線程中異步運行。這樣即便程序忙,色彩光標也能響應。
——也就是,Windows不能夠?

用線程解析事件是個絕妙的主意(不管是性能仍是效率),但若是你的產品面向Windows,give it up。你能夠採用過濾器這個方法——也能提升效率,但沒有線程明顯——不過,Windows上可用:) 事件

像這樣:

……

int process_events(const SDL_Event *event)

……

int main(int argc, char **argv)
{
    ……
    SDL_SetEventFilter(process_events);
    ……
    // 主循環
    while (! quited) {
        SDL_PollEvent(NULL);
        ……
    }
    return 0;
}

int process_events(const SDL_Event *event)
{
    switch (event->type) {
        case ……:
        ……
        case ……:
        ……
        case ……:
        ……
    }
    return 0;
}

Happy Hacking.

油菜 2013.1

相關文章
相關標籤/搜索