C++ SDL_事件似乎阻止了窗口表面的更新
我目前正在浏览SDL2的Lazy Foo教程(我在Linux机器上做这件事),我遇到了某种错误,在我的主循环中包含C++ SDL_事件似乎阻止了窗口表面的更新,c++,sdl,sdl-2,C++,Sdl,Sdl 2,我目前正在浏览SDL2的Lazy Foo教程(我在Linux机器上做这件事),我遇到了某种错误,在我的主循环中包含SDL\u PollEvent似乎阻止了SDL\u UpdateWindowSurface的实际更新。如果我退出SDL\u PollEvent循环,加载的bmp将正确显示。但是,如果我包含SDL\u PollEvent循环,甚至调用SDL\u PollEvent,那么窗口永远不会用图像更新。其他一切似乎都很正常,SDL\u PollEvent正确地排队事件,循环正确地处理事件,但由于
SDL\u PollEvent
似乎阻止了SDL\u UpdateWindowSurface
的实际更新。如果我退出SDL\u PollEvent
循环,加载的bmp将正确显示。但是,如果我包含SDL\u PollEvent
循环,甚至调用SDL\u PollEvent
,那么窗口永远不会用图像更新。其他一切似乎都很正常,SDL\u PollEvent
正确地排队事件,循环正确地处理事件,但由于某种原因,包含SDL\u PollEvent
与不包含它之间存在视觉差异
使用以下提供的代码:
此循环无法更新窗口:
while( !quit )
{
//Handle events on queue
while( SDL_PollEvent( &e ) != 0 )
{
//User requests quit
if( e.type == SDL_QUIT )
{
quit = true;
}
}
//Apply the image
SDL_BlitSurface( gXOut, NULL, gScreenSurface, NULL );
//Update the surface
SDL_UpdateWindowSurface( gWindow );
}
此循环使用加载的图像成功更新窗口:
while( !quit )
{
//Apply the image
SDL_BlitSurface( gXOut, NULL, gScreenSurface, NULL );
//Update the surface
SDL_UpdateWindowSurface( gWindow );
}
但它停止了对SDL\u polleevent
的单个调用:
while( !quit )
{
SDL_PollEvent(&e);
//Apply the image
SDL_BlitSurface( gXOut, NULL, gScreenSurface, NULL );
//Update the surface
SDL_UpdateWindowSurface( gWindow );
}
表示如果调整窗口大小,此曲面将无效。在初始窗口创建时,会生成多个事件,如显示的SDL\u WINDOWEVENT\u
和暴露的SDL\u WINDOWEVENT\u
。虽然窗口没有标记为用户可调整大小,但我认为窗口管理器仍然能够执行调整大小;您可能需要检查事件队列中放置了哪些事件(因为我无法再现您的问题-可能是特定于窗口管理器的)
在另一个世界中,窗口表面不能保证在某些事件之后保持不变,所以理论上刷新事件队列可以使表面失效。您需要在刷新事件队列之后,在绘制之前,在每个帧上获取窗口表面:
while( !quit )
{
// event loop here
// get surface to draw on
gScreenSurface = SDL_GetWindowSurface(gWindow);
//Apply the image
SDL_BlitSurface( gXOut, NULL, gScreenSurface, NULL );
//Update the surface
SDL_UpdateWindowSurface( gWindow );
}
您是否正在声明
e
?是否存在SDL_事件e代码>某处?您是否在正确的线程中调用SDL_PollEvent?在文档中:“由于此函数隐式调用SDL_PumpEvents(),因此只能在设置视频模式的线程中调用此函数。”是的,除了上面显示的代码外,其余代码与教程中使用的代码相同,可以从页面下载。此外,这不是SDL_事件本身不工作的问题,它可以很好地拾取事件,如果我愿意,我可以处理它们。本教程中没有多线程代码,因此SDL的边缘情况在这里不应该是一个问题。问题是我似乎无法在不影响图像是否成功显示在窗口中的情况下包含SDL_事件
。@oldmanmike可能存在使窗口表面无效的调整大小事件。在事件循环之后,但就在间歇之前,获取窗口表面。