SDL_PollEvent 似乎阻止窗口表面更新

2023-12-10

我目前正在浏览 SDL2 的 Lazy Foo 教程(我在 Linux 机器上执行此操作),并且遇到了某种错误,其中包含SDL_PollEvent在我的主循环中似乎可以防止SDL_UpdateWindowSurface从实际更新来看。如果我离开SDL_PollEvent循环输出后,加载的 bmp 可以正常显示。但是,如果我包括SDL_PollEvent循环甚至调用SDL_PollEvent,那么窗口永远不会更新图像。其他一切似乎都运转良好SDL_PollEvent正确地对事件进行排队并且循环正确地处理事件,但由于某种原因,包含的内容之间存在视觉差异SDL_PollEventvs. 忽略它。

使用提供的代码第 03 课:事件驱动编程:

此循环无法更新窗口:

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 文档 says This surface will be invalidated if the window is resized。初始窗口创建时会生成几个事件,例如SDL_WINDOWEVENT_SHOWN and SDL_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 );
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SDL_PollEvent 似乎阻止窗口表面更新 的相关文章

随机推荐