【发布时间】:2017-10-30 03:58:55
【问题描述】:
我将 Windows API 的 CreateWindow 封装在我称为 GLWindow 的类周围,我使用 OpenGL 将图像渲染到该类。
我花了一些时间,我什至封装了消息队列,所以我的main函数基本上是这样的:
int main()
{
GLWindow win;
win.create("OpenGL Window", false, 1600, 800, -1, -1, true);
win.hideCursor();
win.moveMouseToCenter();
init(); //initialize some opengl stuff
bool quit = false;
WindowEvent ev;
while (!quit) {
if (win.pollEvent(ev))
{
if (ev.type == ev.WindowClosed || (ev.type == ev.KeyboardKeyPressed && ev.keyboardKey.key == Keyboard::Key::Escape))
quit = true;
else
handleEvent(ev);
}
updateCamera(&win);
render(&win);
}
return 0;
}
render 函数显然占用了最多时间,它导致窗口过程函数被消息淹没,最终导致 WM_KEYDOWN 和 WM_MOUSEMOVE 消息延迟,因此相机更新是也延迟了。 (内updateCamera())
知道我能做什么吗?
【问题讨论】:
-
您可以将
if (win.pollEvent(ev))更改为while (win.pollEvent(ev)),这样您就可以处理上一帧中生成的所有条消息。 -
“它会导致窗口过程函数被消息淹没” - 这听起来不对...
-
为什么这被否决了?这似乎是一个完全合理的问题。 SO有什么问题?似乎很多人(显然?)害怕发布答案,而是使用评论部分提出解决方案或可能的解决方案?
-
@Manius:猜测一下,因为它不包含minimal reproducible example。尽管如此,核心问题还是很明显的,而且 - 无论如何对我来说 - 这个问题看起来比其他许多问题更有价值。
-
@Manius:我不同意这一点。生成minimal reproducible example 是一项艰苦的工作,但这并不意味着不应该这样做。这就是为什么 Stack Overflow 是一个如此宝贵的资源的部分原因:独立的问题,它讲述了整个故事,而不仅仅是 OP 认为相关的部分(这通常是一个错误的评估)。但是,对于任何进行过任何实时渲染的人以及寻求帮助的人来说,这个问题都有足够的信息来回答。尽管如此,它还是一个异常值,而不是常态。