首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PhysX中的时间步长

PhysX中的时间步长
EN

Stack Overflow用户
提问于 2014-01-07 15:04:10
回答 3查看 1.1K关注 0票数 0

我试图为PhysX应用程序中的物理模拟定义一个时间步骤,这样所有机器上的物理都能以相同的速度运行。我希望物理更新到60 for,所以每次更新都应该有1/60秒的增量时间。

我的应用程序必须使用过剩。目前,我的循环设置如下。

闲置功能:

代码语言:javascript
复制
void GLUTGame::Idle()
{
    newElapsedTime = glutGet(GLUT_ELAPSED_TIME);
    deltaTime = newElapsedTime - lastElapsedTime;
    lastElapsedTime = newElapsedTime;

    glutPostRedisplay();
}

在这种情况下,帧速率并不重要--真正重要的是我的物理更新的速度。

我的呈现函数包含以下内容:

代码语言:javascript
复制
void GLUTGame::Render()
{
    // Rendering Code

    simTimer += deltaTime;

    if (simTimer > m_fps)
    {
        m_scene->UpdatePhys(m_fps);
        simTimer = 0;
    }
}

其中:

代码语言:javascript
复制
Fl32 m_fps = 1.f/60.f

然而,这导致了一些非常缓慢的更新,因为在大多数循环中,deltaTime似乎等于0(实际上不应该.)我尝试将我的deltaTime计算移到我的呈现函数的底部,因为我认为空闲回调被调用得太频繁了,但这并没有解决这个问题。知道我在这里做错什么了吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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)返回,这是由于整数舍入。

票数 2
EN

Stack Overflow用户

发布于 2014-01-07 15:14:23

很可能你把很小的数字加到更大的数字上,然后得到舍入误差。试试这个:

代码语言:javascript
复制
void GLUTGame::Idle()
{
  newElapsedTime = glutGet(GLUT_ELAPSED_TIME);
  timeDelta = newElapsedTime - lastElapsedTime;
  if (timeDelta <  m_fps) return;
  lastElapsedTime = newElapsedTime;

  glutPostRedisplay();
}

如果您愿意,可以在另一种方法中做类似的事情。

票数 0
EN

Stack Overflow用户

发布于 2014-01-07 17:08:10

我现在没有任何关于过剩或PhysX的信息,但不管游戏运行得有多快,如何以相同的速度执行(使用整数):

代码语言:javascript
复制
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参数,它将所有更新因子乘以该参数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20974969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档