В настоящее время я делаю работу по интеграции физического движка Bullet Physics в свой графический движок. До этого я реализовал простую систему столкновений с SAP и алгоритмом Narrowphase, стоимость времени составляла 3 мс для SAP и Narrowphase с примерно 300 объектами.
Из-за некоторых ошибок моего алгоритма я решил перейти на настоящий физический движок, Bullet Physics. Таким образом, я следовал за учебником официальными статьями. Когда я думал, что я знаю, как реализовать в моем графическом движке, и экран вывода становится 3 кадра в секунду.
Кажется, это моя проблема в том, что я понимаю. Поэтому я делаю очень простой пример, чтобы воспроизвести задержку, с которой я столкнулся.
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. Также предоставьте отладочную информацию ниже.
1138ms, 634ms, 386ms, 297ms, 247ms, 217ms, 211ms, 192ms, 175ms, 163ms, 156ms, 149ms
147ms, 147ms, 137ms, 137ms, 133ms, 126ms, 128мс, 123ms, 126ms, 127ms, 119ms, 119ms, 115ms
116ms, 114ms, 114ms, 114ms, 118ms, 120 мс, 108ms, 107ms, 107ms, 109ms, 103ms, 105ms, 102ms
115ms, 106ms, 102ms, 99 мс, 99 мс, 96ms, 94ms, 93ms, 93ms, 97ms, 94ms, 94ms, 89 мс, 90 мс, 89 мс
90 мс, 90 мс, 87ms, 87ms, 84ms, 85ms, 86ms, 92ms, 88ms, 84ms, 85ms, 83ms, 110ms, 86ms, 84ms
83ms, 85ms, 82MS, 89 мс, 80 мс, 80 мс, 77ms, 76ms, 81ms, 78ms, 75 мс, 79 мс, 75 мс, 77ms, 78ms,
76ms, 78ms, 79 мс, 75 мс, 77ms, 74ms, 74ms, 73ms, 72ms, 78ms, 72ms, 71ms, 72ms, 73ms, 73ms,
77ms, 77ms, 71ms, 70ms, 71ms, 68ms, 71ms, 71ms, 73ms, 69ms, 68ms, 67ms, 67ms, 66ms, 68ms
71ms, 74ms, 66ms, 66ms, 65ms, 65ms, 66ms, 67ms, 64ms, 65ms, 63ms, 66ms, 64ms, 65ms, 63ms
67ms, 64ms, 63ms, 62ms, 66ms, 63ms, 61ms, 63ms, 62ms, 64ms, 61ms, 63ms, 61ms, 61ms, 64ms
65ms, 61ms, 63ms, 65ms, 63ms, 62ms, 61ms, 60ms, 61ms, 63ms, 60ms, 61ms, 61ms, 62ms, 60ms,
62ms, 65ms, 60ms, 61ms
До 35-го цикла он чрезвычайно медленный, а пока что будет стабильным в течение 60 мс. Но это также медленно для цикла обработки графики, так где же я неправильно понял в учебнике Hello World? Мне нужен кто-то, чтобы выручить меня 🙁
Этот вопрос разработан BDL в разделе комментариев.
Просто создайте проект, чтобы выпустить версию, и stepSimulation
запускается в 0мс!
Других решений пока нет …