我试图为PhysX应用程序中的物理模拟定义一个时间步骤,这样所有机器上的物理都能以相同的速度运行。我希望物理更新到60 for,所以每次更新都应该有1/60秒的增量时间。
我的应用程序必须使用过剩。目前,我的循环设置如下。
闲置功能:
void GLUTGame::Idle()
{
newElapsedTime = glutGet(GLUT_ELAPSED_TIME);
deltaTime = newElapsedTime - lastElapsedTime;
lastElapsedTime = newElapsedTime;
glutPostRedisplay();
}在这种情况下,帧速率并不重要--真正重要的是我的物理更新的速度。
我的呈现函数包含以下内容:
void GLUTGame::Render()
{
// Rendering Code
simTimer += deltaTime;
if (simTimer > m_fps)
{
m_scene->UpdatePhys(m_fps);
simTimer = 0;
}
}其中:
Fl32 m_fps = 1.f/60.f然而,这导致了一些非常缓慢的更新,因为在大多数循环中,deltaTime似乎等于0(实际上不应该.)我尝试将我的deltaTime计算移到我的呈现函数的底部,因为我认为空闲回调被调用得太频繁了,但这并没有解决这个问题。知道我在这里做错什么了吗?
发布于 2014-01-07 15:33:52
从OpenGL网站中,我们发现glutGet(GLUT_ELAPSED_TIME)以int的形式返回传递的毫秒数。因此,如果您每秒调用void GLUTGame::Idle()方法大约2000次,那么在一个这样的调用之后传递的时间大约是1000 * 1/2000 =0.5ms。因此,每秒超过2000次对无效GLUTGame::Idle()的调用导致glutGet(GLUT_ELAPSED_TIME)返回,这是由于整数舍入。
发布于 2014-01-07 15:14:23
很可能你把很小的数字加到更大的数字上,然后得到舍入误差。试试这个:
void GLUTGame::Idle()
{
newElapsedTime = glutGet(GLUT_ELAPSED_TIME);
timeDelta = newElapsedTime - lastElapsedTime;
if (timeDelta < m_fps) return;
lastElapsedTime = newElapsedTime;
glutPostRedisplay();
}如果您愿意,可以在另一种方法中做类似的事情。
发布于 2014-01-07 17:08:10
我现在没有任何关于过剩或PhysX的信息,但不管游戏运行得有多快,如何以相同的速度执行(使用整数):
if (currentTime - lastUpdateTime > msPerUpdate)
{
DWORD msPassed = currentTime - lastUpdateTime;
int updatesPassed = msPassed / msPerUpdate;
for (int i=0; i<updatesPassed; i++)
UpdatePhysX(); //or whatever function you use
lastUpdateTime = currentTime - msPassed + (updatesPassed * msPerUpdate);
}在每次通过游戏循环将currentTime更新为timeGetTime的情况下,lastUpdateTime是PhysX最后一次更新,而msPerUpdate是为每个更新分配的毫秒数--60 for为16或17 ms。
如果您想支持浮点更新因子(这是物理应用程序推荐的),那么定义float timeMultiplier并将其更新如下:timeMultiplier = (float)frameRate / desiredFrameRate; -其中frameRate是不言自明的,而desiredFramerate是60.0f,如果您希望物理更新达到60 fps。要做到这一点,您必须将UpdatePhysX更新为一个float参数,它将所有更新因子乘以该参数。
https://stackoverflow.com/questions/20974969
复制相似问题