faster EntitySimulation::takeDeadEntities()

This commit is contained in:
Andrew Meadows 2018-03-13 11:38:50 -07:00
parent e1d2a5e5f3
commit 6746e08206
5 changed files with 7 additions and 12 deletions

View file

@ -40,12 +40,9 @@ void EntitySimulation::updateEntities() {
sortEntitiesThatMoved(); sortEntitiesThatMoved();
} }
void EntitySimulation::takeDeadEntities(VectorOfEntities& entitiesToDelete) { void EntitySimulation::takeDeadEntities(SetOfEntities& entitiesToDelete) {
QMutexLocker lock(&_mutex); QMutexLocker lock(&_mutex);
for (auto entity : _deadEntities) { entitiesToDelete.swap(_deadEntities);
// push this entity onto the external list
entitiesToDelete.push_back(entity);
}
_deadEntities.clear(); _deadEntities.clear();
} }

View file

@ -75,7 +75,7 @@ public:
EntityTreePointer getEntityTree() { return _entityTree; } EntityTreePointer getEntityTree() { return _entityTree; }
virtual void takeDeadEntities(VectorOfEntities& entitiesToDelete); virtual void takeDeadEntities(SetOfEntities& entitiesToDelete);
/// \param entity pointer to EntityItem that needs to be put on the entitiesToDelete list and removed from others. /// \param entity pointer to EntityItem that needs to be put on the entitiesToDelete list and removed from others.
virtual void prepareEntityForDelete(EntityItemPointer entity); virtual void prepareEntityForDelete(EntityItemPointer entity);

View file

@ -1800,7 +1800,7 @@ void EntityTree::update(bool simulate) {
_simulation->updateEntities(); _simulation->updateEntities();
{ {
PROFILE_RANGE(simulation_physics, "Deletes"); PROFILE_RANGE(simulation_physics, "Deletes");
VectorOfEntities deadEntities; SetOfEntities deadEntities;
_simulation->takeDeadEntities(deadEntities); _simulation->takeDeadEntities(deadEntities);
if (deadEntities.size() > 0) { if (deadEntities.size() > 0) {
// translate into list of ID's // translate into list of ID's

View file

@ -73,17 +73,15 @@ void PhysicalEntitySimulation::removeEntityInternal(EntityItemPointer entity) {
} }
} }
void PhysicalEntitySimulation::takeDeadEntities(VectorOfEntities& deadEntities) { void PhysicalEntitySimulation::takeDeadEntities(SetOfEntities& deadEntities) {
QMutexLocker lock(&_mutex); QMutexLocker lock(&_mutex);
for (auto entity : _deadEntities) { for (auto entity : _deadEntities) {
// this entity is still in its tree, so we insert into the external list
deadEntities.push_back(entity);
EntityMotionState* motionState = static_cast<EntityMotionState*>(entity->getPhysicsInfo()); EntityMotionState* motionState = static_cast<EntityMotionState*>(entity->getPhysicsInfo());
if (motionState) { if (motionState) {
_entitiesToRemoveFromPhysics.insert(entity); _entitiesToRemoveFromPhysics.insert(entity);
} }
} }
_deadEntities.swap(deadEntities);
_deadEntities.clear(); _deadEntities.clear();
} }

View file

@ -38,7 +38,7 @@ public:
virtual void addDynamic(EntityDynamicPointer dynamic) override; virtual void addDynamic(EntityDynamicPointer dynamic) override;
virtual void applyDynamicChanges() override; virtual void applyDynamicChanges() override;
virtual void takeDeadEntities(VectorOfEntities& deadEntities) override; virtual void takeDeadEntities(SetOfEntities& deadEntities) override;
signals: signals:
void entityCollisionWithEntity(const EntityItemID& idA, const EntityItemID& idB, const Collision& collision); void entityCollisionWithEntity(const EntityItemID& idA, const EntityItemID& idB, const Collision& collision);