2016-11-13 8 views
2

Je fais actuellement le travail pour intégrer le moteur physique, Bullet Physics, dans mon moteur graphique, Avant cela, j'ai implémenté le système de collision facile avec l'algorithme SAP et NarrowPhase, le coût du temps était de 3ms pour SAP et Narrowphase avec environ 300 objets. En raison de certains bugs de mon algorithme, j'ai décidé de passer au moteur physique réel, Bullet Physics. J'ai donc suivi le tutoriel par des articles officiels. Quand je pensais savoir comment mettre en œuvre dans mon moteur graphique, et l'écran de sortie devient 3 fps.Peu de corps rigides causent Bullet Physics lentement

Cela semble être mon problème sur ce que je comprends. Donc je fais un exemple très simple pour reproduire le décalage que j'ai rencontré.

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; 

Dans le code ci-dessus, je viens de modifier le Hello World tutorial dans le dernier de la page. Le code qui produit l'extrême ralenti stepSimulation. Le différent que j'ai fait est d'ajouter 300 corps rigides à dynamicWorld. Fournissez également les informations de débogage ci-dessous.

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 ms, 66 ms, 65 ms, 65 ms, 66 ms, 67 ms, 64 ms, 65 ms, 63 ms, 66 ms, 64 ms, 65 ms, 63 ms, 0 ms, 61ms, 61ms, 64ms 65ms, 61ms, 63ms, 65ms, 63ms, 62ms, 61ms, 60ms, 61ms, 63ms, 60ms, 61ms, 61ms, 62ms, 60ms, 62ms, 65ms, 60ms, 61ms

Avant 35ème en boucle, c'est extrêmement lent, et pour le moment après ça, ça va être stable sur 60 ms. Mais c'est aussi lent pour un cycle de boucle graphique à gérer, Alors, où est-ce que je comprends mal dans le tutoriel Hello World? J'ai besoin de quelqu'un pour me aider :(

+0

Avez-vous mesuré avec la mise au point ou avec la version de la librairie de la librairie? – BDL

+0

@BDL, je construis la librairie en version debug pour moi-même, ou j'ai besoin de reconstruire en mode release mon fichier * .lib comme ceux-ci ** Bullet3Geometry_Debug.lib **, ** BulletCollision_Debug. lib ** ... – Tokenyet

+1

Il peut y avoir une énorme différence de performance entre la version de débogage et la version Release Reconstruisez tout (les librairies et votre propre application) en mode Release et mesurez à nouveau les timings – BDL

Répondre

2

Cette question est sloved par BDL à la section des commentaires. Juste construire le projet de publier la version et stepSimulation est exécuté en 0ms!