Explorar el Código

scheduler: small review for perf improvements

Michele Caini hace 5 años
padre
commit
3b6dd23598
Se han modificado 3 ficheros con 17 adiciones y 16 borrados
  1. 1 0
      TODO
  2. 14 16
      src/entt/process/scheduler.hpp
  3. 2 0
      test/entt/process/scheduler.cpp

+ 1 - 0
TODO

@@ -15,6 +15,7 @@ WIP:
 * HP: weak reference wrapper example with custom storage
 * HP: paginate pools
 * HP: headless (sparse set only) view
+* HP: scheduler, use any instead of unique_ptr
 * HP: write documentation for custom storages and views!!
 * HP: registry: use a poly object for pools, no more pool_data type.
 * HP: make runtime views use opaque storage and therefore return also elements.

+ 14 - 16
src/entt/process/scheduler.hpp

@@ -84,19 +84,19 @@ class scheduler {
         auto *process = static_cast<Proc *>(handler.instance.get());
         process->tick(delta, data);
 
-        auto dead = process->dead();
-
-        if(dead) {
-            if(handler.next && !process->rejected()) {
+        if(process->rejected()) {
+            return true;
+        } else if(process->dead()) {
+            if(handler.next) {
                 handler = std::move(*handler.next);
                 // forces the process to exit the uninitialized state
-                dead = handler.update(handler, {}, nullptr);
-            } else {
-                handler.instance.reset();
+                return handler.update(handler, {}, nullptr);
             }
+
+            return true;
         }
 
-        return dead;
+        return false;
     }
 
     template<typename Proc>
@@ -252,19 +252,17 @@ public:
      * @param data Optional data.
      */
     void update(const Delta delta, void *data = nullptr) {
-        bool clean = false;
+        auto sz = handlers.size();
 
         for(auto pos = handlers.size(); pos; --pos) {
             auto &handler = handlers[pos-1];
-            const bool dead = handler.update(handler, delta, data);
-            clean = clean || dead;
-        }
 
-        if(clean) {
-            handlers.erase(std::remove_if(handlers.begin(), handlers.end(), [](auto &handler) {
-                return !handler.instance;
-            }), handlers.end());
+            if(const auto dead = handler.update(handler, delta, data); dead) {
+                std::swap(handler, handlers[--sz]);
+            }
         }
+
+        handlers.erase(handlers.begin() + sz, handlers.end());
     }
 
     /**

+ 2 - 0
test/entt/process/scheduler.cpp

@@ -90,6 +90,7 @@ TEST(Scheduler, Then) {
     }
 
     ASSERT_EQ(succeeded_process::invoked, 4u);
+    ASSERT_TRUE(scheduler.empty());
 }
 
 TEST(Scheduler, Functor) {
@@ -114,4 +115,5 @@ TEST(Scheduler, Functor) {
 
     ASSERT_TRUE(first_functor);
     ASSERT_TRUE(second_functor);
+    ASSERT_TRUE(scheduler.empty());
 }