欢迎访问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 ….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