gpt4 book ai didi

c++ - SDL_PollEvent 似乎阻止窗口表面更新

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:11:50 26 4
gpt4 key购买 nike

我目前正在浏览 SDL2 的 Lazy Foo 教程(我在 Linux 机器上这样做),我遇到了一些错误,其中包含 SDL_PollEvent 在我的主要循环似乎阻止了 SDL_UpdateWindowSurface 的实际更新。如果我离开 SDL_PollEvent 循环,加载的 bmp 会正确显示。但是,如果我包含 SDL_PollEvent 循环或什至调用 SDL_PollEvent,则窗口永远不会更新图像。其他一切似乎都工作正常,SDL_PollEvent 正确排队事件并且循环正确处理事件,但由于某种原因,包含 SDL_PollEvent 与离开之间存在视觉差异出来。

使用 Lesson 03: Event driven programming 提供的代码:

这个循环无法更新窗口:

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_PollEvent 的单个调用:

while( !quit )
{
SDL_PollEvent(&e);

//Apply the image
SDL_BlitSurface( gXOut, NULL, gScreenSurface, NULL );

//Update the surface
SDL_UpdateWindowSurface( gWindow );
}

最佳答案

SDL_GetWindowSurface documentation 如果调整窗口大小,该表面将失效。初始窗口创建时会生成多个事件,例如 SDL_WINDOWEVENT_SHOWNSDL_WINDOWEVENT_EXPOSED。虽然窗口没有标记为用户可调整大小,但我想窗口管理器仍然可以执行调整大小;您可能需要检查事件队列中放置了哪些事件(因为我无法重现您的问题 - 可能是特定于窗口管理器的)。

换句话说,在其他世界中,不能保证窗口表面在某些事件后持续存在,因此理论上刷新事件队列会使表面无效。在绘制之前刷新事件队列后,您需要在每一帧上获取窗口表面:

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 );
}

关于c++ - SDL_PollEvent 似乎阻止窗口表面更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40113594/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com