]> code.bitgloo.com Git - clyne/entityx.git/commitdiff
Use a vector for the free list. std::list is mind bogglingly slow.
authorAlec Thomas <alec@swapoff.org>
Tue, 30 Dec 2014 23:49:14 +0000 (10:49 +1100)
committerAlec Thomas <alec@swapoff.org>
Tue, 30 Dec 2014 23:49:14 +0000 (10:49 +1100)
entityx/Entity.h

index ce5d2fb99415383958124396142fa19462ab0ed1..fa88726e4ce0b632d2effd93753d9b5633a4825a 100644 (file)
@@ -350,17 +350,17 @@ class EntityManager : entityx::help::NonCopyable {
 
    protected:
     ViewIterator(EntityManager *manager, uint32_t index)
-        : manager_(manager), i_(index), capacity_(manager_->capacity()) {
+        : manager_(manager), i_(index), capacity_(manager_->capacity()), free_cursor_(~0UL) {
       if (All) {
-        manager_->free_list_.sort();
-        free_cursor_ = manager_->free_list_.begin();
+        std::sort(manager_->free_list_.begin(), manager_->free_list_.end());
+        free_cursor_ = 0;
       }
     }
     ViewIterator(EntityManager *manager, const ComponentMask mask, uint32_t index)
-        : manager_(manager), mask_(mask), i_(index), capacity_(manager_->capacity()) {
+        : manager_(manager), mask_(mask), i_(index), capacity_(manager_->capacity()), free_cursor_(~0UL) {
       if (All) {
-        manager_->free_list_.sort();
-        free_cursor_ = manager_->free_list_.begin();
+        std::sort(manager_->free_list_.begin(), manager_->free_list_.end());
+        free_cursor_ = 0;
       }
     }
 
@@ -380,7 +380,8 @@ class EntityManager : entityx::help::NonCopyable {
     }
 
     inline bool valid_entity() {
-      if (free_cursor_ != manager_->free_list_.end() && *free_cursor_ == i_) {
+      const std::vector<uint32_t> &free_list = manager_->free_list_;
+      if (free_cursor_ < free_list.size() && free_list[free_cursor_] == i_) {
         ++free_cursor_;
         return false;
       }
@@ -391,7 +392,7 @@ class EntityManager : entityx::help::NonCopyable {
     ComponentMask mask_;
     uint32_t i_;
     size_t capacity_;
-    std::list<uint32_t>::iterator free_cursor_;
+    size_t free_cursor_;
   };
 
   template <bool All>
@@ -519,8 +520,8 @@ class EntityManager : entityx::help::NonCopyable {
       accomodate_entity(index);
       version = entity_version_[index] = 1;
     } else {
-      index = free_list_.front();
-      free_list_.pop_front();
+      index = free_list_.back();
+      free_list_.pop_back();
        version = entity_version_[index];
     }
     Entity entity(this, Entity::Id(index, version));
@@ -840,7 +841,7 @@ class EntityManager : entityx::help::NonCopyable {
   // Vector of entity version numbers. Incremented each time an entity is destroyed
   std::vector<uint32_t> entity_version_;
   // List of available entity slots.
-  std::list<uint32_t> free_list_;
+  std::vector<uint32_t> free_list_;
 };