很少有刚体缓慢地引起子弹物理

Few rigidbody cause Bullet Physics slowly

本文关键字:子弹 缓慢      更新时间:2023-10-16

我目前的工作是将物理引擎Bullet physics整合到我的图像引擎中,在此之前,我使用SAP和Narrowphase算法实现了简单的碰撞系统,SAP和Narrowphase的时间成本是3ms,大约300个对象。

由于我的算法存在一些bug,我决定改用真正的物理引擎Bullet physics。所以我跟随官方文章的教程。当我认为我知道如何在我的图像引擎中执行时,输出屏幕变成了3 fps。

据我所知,这似乎是我的问题。所以我做了一个非常简单的例子来重现我所遇到的延迟。
btBroadphaseInterface* broadphase = new btDbvtBroadphase();
btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration();
btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration);
btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver;
btDiscreteDynamicsWorld* dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration);
dynamicsWorld->setGravity(btVector3(0, -10, 0));

btCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0, 1, 0), 1);
btCollisionShape* fallShape = new btSphereShape(1);

btDefaultMotionState* groundMotionState = new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), btVector3(0, -1, 0)));
btRigidBody::btRigidBodyConstructionInfo
    groundRigidBodyCI(0, groundMotionState, groundShape, btVector3(0, 0, 0));
btRigidBody* groundRigidBody = new btRigidBody(groundRigidBodyCI);
dynamicsWorld->addRigidBody(groundRigidBody);

btDefaultMotionState* fallMotionState =
    new btDefaultMotionState(btTransform(btQuaternion(0, 0, 0, 1), btVector3(0, 50, 0)));
btScalar mass = 1;
btVector3 fallInertia(0, 0, 0);
fallShape->calculateLocalInertia(mass, fallInertia);
btRigidBody::btRigidBodyConstructionInfo fallRigidBodyCI(mass, fallMotionState, fallShape, fallInertia);
btRigidBody* fallRigidBody = new btRigidBody(fallRigidBodyCI);
btRigidBody** fallRigidBodies = new btRigidBody*[300];
for (int i = 0; i < 300; i++)
{
    fallRigidBodies[i] = new btRigidBody(fallRigidBodyCI);
    dynamicsWorld->addRigidBody(fallRigidBodies[i]);
}

for (int i = 0; i < 1000; i++) {
    Debug::StartMeasureNumber(10); // my time measurement function & measurement id
    dynamicsWorld->stepSimulation(1 / 60.f, 10);
    Debug::EndMeasureNumber(10); // this will report the time elapsed.
    btTransform trans;
    fallRigidBody->getMotionState()->getWorldTransform(trans);
    //std::cout << "sphere height: " << trans.getOrigin().getY() << std::endl;
}
dynamicsWorld->removeRigidBody(fallRigidBody);
delete fallRigidBody->getMotionState();
delete fallRigidBody;
dynamicsWorld->removeRigidBody(groundRigidBody);
delete groundRigidBody->getMotionState();
delete groundRigidBody;

delete fallShape;
delete groundShape;

delete dynamicsWorld;
delete solver;
delete collisionConfiguration;
delete dispatcher;
delete broadphase;

在上面的代码中,我只是修改了页面最后部分的Hello World教程。在stepSimulation上产生极慢的代码。我所做的不同之处在于将300个刚体添加到dynamicsWorld。同时提供下面的调试信息。

1138毫秒,634毫秒,386毫秒,297毫秒,247毫秒,217毫秒,211毫秒,192毫秒,175毫秒,163毫秒,156毫秒,149毫秒147毫秒,147毫秒,137毫秒,137毫秒,133毫秒,126毫秒,128毫秒,123毫秒,126毫秒,127毫秒,119毫秒,119毫秒,115毫秒116毫秒,114毫秒,114毫秒,114毫秒,118毫秒,120毫秒,108毫秒,107毫秒,107毫秒,109毫秒,103毫秒,105毫秒,102毫秒115毫秒,106毫秒,102毫秒,99毫秒,99毫秒,96毫秒,94毫秒,93毫秒,93毫秒,97毫秒,94毫秒,94毫秒,89毫秒,90毫秒,89毫秒90毫秒,90毫秒,87毫秒,87毫秒,84毫秒,85毫秒,86毫秒,92毫秒,88毫秒,84毫秒,85毫秒,83毫秒,110毫秒,86毫秒,84毫秒83毫秒,85毫秒,82毫秒,89毫秒,80毫秒,80毫秒,77毫秒,76毫秒,81毫秒,75毫秒,78毫秒,79毫秒,75毫秒,77毫秒,78毫秒,76毫秒,78毫秒,79毫秒,75毫秒,77毫秒,74毫秒,74毫秒,73毫秒,72毫秒,78毫秒,72毫秒,71毫秒,72毫秒,73毫秒,73毫秒,77毫秒,77毫秒,71毫秒,70毫秒,71毫秒,68毫秒,71毫秒,71毫秒,73毫秒,69毫秒,68毫秒,67毫秒,67毫秒,66毫秒,68毫秒71毫秒,74毫秒,66毫秒,66毫秒,65毫秒,65毫秒,66毫秒,67毫秒,64毫秒,65毫秒,63毫秒,66毫秒,64毫秒,65毫秒,63毫秒67毫秒,64毫秒,63毫秒,62毫秒,66毫秒,63毫秒,61毫秒,63毫秒,62毫秒,64毫秒,61毫秒,63毫秒,61毫秒,61毫秒,64毫秒65毫秒,61毫秒,63毫秒,65毫秒,63毫秒,62毫秒,61毫秒,60 ms, 61毫秒,63毫秒,60 ms, 61毫秒,61毫秒,62毫秒,60毫秒,62毫秒,65毫秒,60 ms, 61 ms

在第35个循环之前,它是非常慢的,之后的一段时间,它将稳定在60毫秒。但这对于图形循环周期来说也很慢,所以我在Hello World教程中哪里理解错了?我需要有人帮我一下:(

这个问题是由BDL在评论部分解决的。只需构建项目以发布版本,stepSimulation就可以在0毫秒内运行!