SDL C++ 问题(处于等待状态的窗口)
Posted
技术标签:
【中文标题】SDL C++ 问题(处于等待状态的窗口)【英文标题】:SDL C++ Issues (Window in wait status) 【发布时间】:2012-12-10 21:02:29 【问题描述】:我正在使用 SDL 和 OpenGL,我创建了 SDL_Surface 和 SDL_SetVideoMode:
SDL_Init(SDL_INIT_EVERYTHING);
const SDL_VideoInfo * dinfo = SDL_GetVideoInfo();
// Setup the surface of SDL
if(configurer::fullscreened)
data::Wnd_Surface = SDL_SetVideoMode(configurer::window_width,configurer::window_height,dinfo->vfmt->BitsPerPixel,SDL_FULLSCREEN | SDL_OPENGL);
else
data::Wnd_Surface = SDL_SetVideoMode(configurer::window_width,configurer::window_height,16,SDL_OPENGL);
if(data::Wnd_Surface==0)
return -1;
SDL_WM_SetCaption("Test", "Test");
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
// Initialize GLEW
if(glewInit()!=0)
cout << "Failed to start glew";
return -1;
我在我的主函数中初始化它,然后我有以下(在主函数上):
while(!data::terminate)
AscMainLoop();
SDL_Delay(80);
return 0;
一切都好。我的 AscMainLoop 函数:
int timerelapse = SDL_GetTicks();
//Check for key events
/* BLA BLA BLA *(
AscUpdateComponents(); // Update matrixes and bla bla bla...
AscRender();// Paint
// Fps Counter Update
/* BLA BLA BLA */
SDL_GL_SwapBuffers();// Swap the buffers of our screen
好的,我遇到了一个问题,我运行了应用程序,但屏幕没有响应,我认为问题在于 main 上的 while 循环。 窗口打开,但我不能拖动它,调整它的大小,这就像窗口上的等待状态(Windows 7 有趣的“请等待”光标)激活。 我已经尝试将主循环放在一个线程中。不知道怎么回事……
编辑:就像主函数循环导致的冻结状态
【问题讨论】:
你为什么打电话给SDL_GL_SetAttribute()
之后 SDL_SetVideoMode()
?
我已经解决了,问题仍然存在。
您确定您的“检查关键事件”部分不是无限循环吗?
其实例子中的代码我写错了,是/* BLA BLA BLA */ 呵呵,那个代码是AscMainLoop函数,在main的while循环中调用,是无限循环,因为它需要更新 SDL Surface (SDL_GL_SwapBuffers()) 并使用 openGL 绘制对象。它应该是一个无限循环,就像我说的,我已经在一个线程中尝试过......
您可能想自学使用调试器。
【参考方案1】:
您需要在while
或AscMainLoop
中处理您的SDL_Event
s,方法是:
SDL_Event Event;
while(SDL_PollEvent(&Event))
// Later, you'll be adding your code that handles keyboard / mouse input here
【讨论】:
非常感谢!我不知道,真的有必要吗?为什么? 虽然没有记录在案,但我假设在 Windows 上它还充当为您的窗口处理消息的WndProc
这就是精神!做一些很棒的事情!如果您还有其他问题,请随时询问
令人着迷的是(至少在 Windows 中),您实际上可以在单独的线程中拥有 SDL_PollEvent,只要该线程是最初调用 SDL_Init 的线程。 FWIW。以上是关于SDL C++ 问题(处于等待状态的窗口)的主要内容,如果未能解决你的问题,请参考以下文章