2016-11-13 1 views
2

저는 현재 물리 엔진, 불릿 물리학을 내 그래픽 엔진에 통합하고 있습니다. 그 전에는 SAP와 Narrowphase 알고리즘을 사용하여 손쉬운 충돌 시스템을 구현했습니다. 시간 비용은 3ms였습니다. SAP 및 Narrowphase에는 약 300 개의 객체가 있습니다.약간의 강체가 원인 천천히 불릿 물리학을 야기합니다.

내 알고리즘의 버그로 인해 실제 물리 엔진 인 Bullet Physics로 변경하기로 결정했습니다. 그래서 나는 공식 기사로 튜토리얼을 따라 갔다. 내 그래픽 엔진에서 구현하는 방법을 알았을 때 출력 화면이 3fps가됩니다.

내가 이해하는 것은 내 문제인 것 같습니다. 그래서 나는 내가 만난 지연을 재현 할 진정한 간단한 예를 만듭니다. 위의 코드에서

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 tutorial를 수정했습니다. 극단을 생성하는 코드는 stepSimulation에서 느립니다. 내가 한 것과 다른 점은 300 개의 강체를 추가하는 것입니다. to dynamicsWorld. 또한 아래에 디버그 정보를 제공하십시오.

1138ms, 634ms, 386ms, 297ms, 247ms, 217ms, 211ms, 192ms, 175ms, 163ms, 156ms, 149ms 147ms, 147ms, 137ms, 137ms, 133ms, 126ms, 128ms, 123ms, 126ms, 127ms, 119ms, 119ms, 115ms 116ms, 114ms, 114ms, 114ms, 118ms, 120ms, 108ms, 107ms, 107ms, 109ms, 103ms, 105ms, 102ms 115ms, 106ms, 102ms, 99ms, 99ms, 96ms, 94ms, 93ms, 93ms, 97ms, 94ms, 94ms, 89ms, 90ms, 89ms 90ms, 90ms, 87ms, 87ms, 84ms, 85ms, 86ms, 92ms, 88ms, 84ms, 85ms, 83ms, 110ms, 86ms, 84ms 83ms, 85ms, 82ms, 89ms, 80ms, 80ms, 77ms, 76ms, 81ms, 75ms, 78ms, 79ms, 75ms, 77ms, 78ms, 76ms, 78ms, 79ms, 75ms, 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, 66 64ms, 63ms, 62ms, 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 전 루프, 그것은 극단적으로 천천히, 그리고 그 후에는 60ms에서 안정 될 것입니다. 그러나 이것은 그래픽 루프 사이클이 처리하기에는 속도가 느립니다. Hello World 튜토리얼에서 어디서 잘못 이해 했습니까? 나는 그냥 버전을 출시 할 수있는 프로젝트를 빌드합니다. :(

+0

당신은 디버그으로 측정하거나나요 라이브러리의 릴리스 버전이 있습니까? – BDL

+0

@BDL, 나 자신을 위해 Debug 버전으로 라이브러리를 빌드하거나 모드를 해제하기 위해 다시 빌드해야합니까? 이러한 * Bullet3Geometry_Debug.lib **, ** BulletCollision_Debug와 같은 * * .lib 파일. lib ** ... – Tokenyet

+1

디버그와 릴리스 버전간에 큰 차이가있을 수 있습니다. 릴리스 모드에서 모든 것을 다시 빌드하고 (해당 라이브러리와 응용 프로그램) 다시 타이밍을 측정하십시오. – BDL

답변

2

이 질문은 코멘트 섹션에서 BDL에 의해 sloved되어 나를 도와 줄 사람이 필요하고, stepSimulation가 에선 0ms에서 실행!

관련 문제