gpt4 book ai didi

c++ - 拖动时保持窗口事件(Win32 上的 SDL)

转载 作者:可可西里 更新时间:2023-11-01 15:24:39 29 4
gpt4 key购买 nike

首先,我的代码设置了 SDL 环境,并继续更新 OpenGL 上下文,而没有执行任何 SDL_Event 处理。这会导致窗口,只要它是打开的,在 Windows 看来是没有响应的。窗口闪烁了一下。标题栏会附加“(Not Responding)”,在窗口内单击时它会变灰,因为 Windows 默认在非响应窗口上执行此操作。然而,在这种状态下(即使在它变灰时和之后),OpenGL 显示继续更新和动画,这就是踢球者,它甚至在拖动窗口时 这样做。很明显,在这种情况下,应用程序没有正确处理来自 Windows 的事件,导致 Windows 认为它​​处于挂起状态。但是有明确的证据表明 opengl 继续呈现。

现在我对代码进行了一次修改,即将这三行代码放置在循环内的适当位置(这也执行 OpenGL 绘制):

SDL_Event event;
if (SDL_PollEvent(&event) && event.type == SDL_QUIT)
break;

所有这一切都是使用 SDL 刷新消息队列。

现在的行为是 Windows 不再认为它是“无响应”并且它不会变灰。没有闪烁。一切似乎都进行得很顺利。但是一旦我单击并拖动标题栏来拖动窗口,渲染就会被阻止。我还没有调试它来确定,但我怀疑 SDL_PollEvent 在窗口拖动期间会阻塞。

有解决办法吗?这很有趣,因为未能处理事件表现出的部分行为证明了我想要的在理论上是可能的。

更新:我找到了这个线程:http://www.gamedev.net/topic/488074-win32-message-pump-and-opengl---rendering-pauses-while-draggingresizing/

结论似乎是它归结为 Microsoft 为我们做出的某些选择...它基本上会卡在 DefWindowProc() 中,直到松开鼠标。解决这个问题会变得非常困惑,我也许可以通过在另一个线程中渲染来解决这个问题。但我什至不想开始考虑从多个线程处理 OpenGL 上下文,如果这可能的话。

最佳答案

一些对我有用的解决方法 - 为 SDL_WINDOWEVENT_SIZE_CHANGED 事件添加事件过滤器并执行额外的 SetViewport 和绘制框架。

int SDLApp::eventFilter(void* pthis, const SDL_Event *event)
{
if (event->type == SDL_WINDOWEVENT &&
event->window.event == SDL_WINDOWEVENT_SIZE_CHANGED)
{
SDLApp* app = (SDLApp*)pthis;
// Note: NULL rectangle is the entire window
SDL_RenderSetViewport(app->renderer_, NULL);
app->DrawFrame();
}
return 1;
}

...
SDL_SetEventFilter((SDL_EventFilter)SDLApp::eventFilter, this);

关于c++ - 拖动时保持窗口事件(Win32 上的 SDL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7106586/

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