在缓冲区交换之前,在死亡时间内程序性地生成地形

我在Windows中使用OpenGL / C ++,我的主循环如下所示:GLboolean done = GL_FALSE; auto_ptr l_world(新世界); l_world->初始化();

while (!done) { if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { if (msg.message==WM_QUIT) { done = GL_TRUE; } else { TranslateMessage(&msg); DispatchMessage(&msg); } } else { if (!world->Iteration() || keys[VK_ESCAPE]) { done = GL_TRUE; } else { LocalContext.SwapBuff(); } } } 

Iteration()是:

 GLboolean World::Iteration() { DrawAll(); MoveAll(); CheckForCollisions(); return GL_TRUE; } 

我已经实现了钻石平方algorithm来程序化地生成地形,目前我正在World :: Init()中做。 顶点,索引和纹理存储在缓冲区中以便每帧画出。

对于一个小区域来说很好,但是如果可能的话,我想把它做得更大。 要做到这一点,我想随着相机的移动,在迭代结束时,在绘制,移动和碰撞检测之后,但在缓冲区交换之前进行。 它可以分成几个帧,但我希望尽可能在一个单一的框架内完成。

据我了解,与vsync启用SwapBuffers将阻塞,直到帧的结尾,所以SwapBuffers调用和帧结束之间的任何时间将被浪费。 所以这就是我的问题:是否有一种方法可以告诉我有多less时间,直到帧结束,所以我可以继续生成地形,直到最后一个可能的瞬间,但仍然保持一致的帧速率?

我在“ OpenGL同步”页面上找不到任何有用的信息。 我想知道是否三重缓冲可能是答案 – 如果其他后台缓冲区包含一个完整的帧,保持生成; 如果它是空的,那么SwapBuffers。 这不是一个很好的解决scheme,因为它会使三重缓冲是强制性的,你将如何检测是否有一个后备缓冲区是免费的? 有更好的建议吗?

Solutions Collecting From Web of "在缓冲区交换之前,在死亡时间内程序性地生成地形"

不幸的是,在OpenGL中没有这样的机制。 另一方面,对于我们使用的多任务系统,几乎没有任何方法可以知道发生了什么 – 可能是因为您的病毒扫描程序只是决定在某个时间点开始下载更新程序,并且弄乱了您的时间安排,可以做的关于它.. =)

不久之前,你甚至不能依靠个人电脑的刷新率。 目前这个标准似乎是60Hz,但是即使这个标准也可能会随着110Hz,120Hz和144Hz的显示而改变。

所以最好将游戏逻辑与渲染分离(所以渲染帧速率可能会改变,而游戏逻辑/物理将以稳定的速度运行),并在单独的线程上进行任何地形生成/预加载。

如果您正在一个拥有绝对控制权(或接近控制权)的平台上工作,那么情况就不同了。