winapi - 在 Win32 OpenGL 中更新场景的正确方法是什么

标签 winapi opengl

现在我有两个计时器。一个用于物理,一个用于显示。

显示计时器附加到主窗口。它大约每 5 毫秒发送一次消息 WM_PAINT,WM_PAINT 消息处理程序表示运行 opengl 显示代码,然后执行 SwapBuffers()。

物理计时器附加到辅助窗口(没有其他原因,我知道如何实现 Windows 计时器的唯一方法是将其附加到窗口)。处理程序使它更新我的物理代码。

但是,我注意到有时显示是“spazzy”。它几乎不引人注意,也许每秒一个微小的 spaz,但我怀疑发生了什么事情使物理运动在短时间内变慢或变快。

最佳答案

交互式模拟(像你的)的正确方法是调用绘图函数作为空闲操作:

... idle_action(...)
{
    redraw();
}

... event_loop(...)
{
    while(!quit) {
       event e = PeekEvent();
       if( e != NO_EVENT ) {
           process_event();
       } else {
           idle_action();
       }
    }
}

您应该测量绘制帧所花费的时间,而不是使用计时器。

另外,为了物理模拟的精确性,您也不应该为此使用计时器。相反,您应该以恒定长度的较小时间步长推进它,以便单个渲染帧有多个时间步长。因此,例如,对于 60Hz 的刷新率,您的帧间隔约为 16ms。 如果您以 1 毫秒的步长执行物理模拟,您将计算其间的 16 个步长。 *请注意,大多数(如果不是全部)物理模拟包都在内部执行此操作。 IE。您正在设置步长间隔,然后仅在您希望进行的所需时间调用物理模拟。

在实践中,这意味着您将在测量要拍摄的框架图时推进您的物理模拟。

关于winapi - 在 Win32 OpenGL 中更新场景的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9265955/

相关文章:

c - Win32 消息循环 : Quitting after window closes with GetMessage(&msg, NULL、0、0)?

c++ - 为什么使用CoInitialize(0);在 C++ 中

delphi - 如何检索 Windows 用户的超链接颜色首选项值?

c++ - new 和 delete char* 导致异常

delphi - 设置 Canvas.LineTo 的线端样式

c++ - OpenGL 两个不同的 3d 渲染图片控件在单个 MFC 对话框上不起作用

c - 尝试在 Mac OSX 的 OpenGL 中使用鼠标外观相机

c++ - 无法在 OpenGL 中随时间改变颜色

opengl - 是否可以使用自定义 mipmap 大小?

iphone - 如何在 UIView 和 EAGLView 之间进行混合?