Optimize VectorAnimationRenderer managing 33/304333/5
authorEunki, Hong <eunkiki.hong@samsung.com>
Tue, 16 Jan 2024 06:08:10 +0000 (15:08 +0900)
committerEunki, Hong <eunkiki.hong@samsung.com>
Tue, 16 Jan 2024 08:27:25 +0000 (17:27 +0900)
Since most of case we use container validate or not when we Add/Remove
the EventHandler. It is quite heavy job if we have a lots of lottie file has.

Change-Id: Iec4de3aaa1e49663fce67cc7fb788f25e359a8fc
Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
dali-extension/vector-animation-renderer/vector-animation-plugin-manager.cpp
dali-extension/vector-animation-renderer/vector-animation-plugin-manager.h

index a8684f9..1a4a2a6 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,6 +19,7 @@
 #include <dali-extension/vector-animation-renderer/vector-animation-plugin-manager.h>
 
 // EXTERNAL INCLUDES
+#include <dali/devel-api/common/map-wrapper.h>
 #include <dali/integration-api/adaptor-framework/adaptor.h>
 #include <dali/integration-api/debug.h>
 
@@ -42,8 +43,10 @@ VectorAnimationPluginManager& VectorAnimationPluginManager::Get()
 VectorAnimationPluginManager::VectorAnimationPluginManager()
 : mEventHandlers(),
   mTriggeredHandlers(),
+  mTriggerOrderId(0u),
   mMutex(),
-  mEventTrigger()
+  mEventTrigger(),
+  mEventTriggered(false)
 {
 }
 
@@ -54,21 +57,22 @@ VectorAnimationPluginManager::~VectorAnimationPluginManager()
 
 void VectorAnimationPluginManager::AddEventHandler(VectorAnimationEventHandler& handler)
 {
-  if(mEventHandlers.end() == std::find(mEventHandlers.begin(), mEventHandlers.end(), &handler))
+  if(mEventHandlers.end() == mEventHandlers.find(&handler))
   {
     if(mEventHandlers.empty())
     {
       Adaptor::Get().RegisterProcessor(*this);
     }
 
-    mEventHandlers.push_back(&handler);
+    mEventHandlers.insert(&handler);
 
     {
       Dali::Mutex::ScopedLock lock(mMutex);
 
       if(!mEventTrigger)
       {
-        mEventTrigger = std::unique_ptr<EventThreadCallback>(new EventThreadCallback(MakeCallback(this, &VectorAnimationPluginManager::OnEventTriggered)));
+        mEventTrigger   = std::unique_ptr<EventThreadCallback>(new EventThreadCallback(MakeCallback(this, &VectorAnimationPluginManager::OnEventTriggered)));
+        mEventTriggered = false;
       }
     }
   }
@@ -76,7 +80,7 @@ void VectorAnimationPluginManager::AddEventHandler(VectorAnimationEventHandler&
 
 void VectorAnimationPluginManager::RemoveEventHandler(VectorAnimationEventHandler& handler)
 {
-  auto iter = std::find(mEventHandlers.begin(), mEventHandlers.end(), &handler);
+  auto iter = mEventHandlers.find(&handler);
   if(iter != mEventHandlers.end())
   {
     mEventHandlers.erase(iter);
@@ -97,7 +101,7 @@ void VectorAnimationPluginManager::RemoveEventHandler(VectorAnimationEventHandle
   {
     Dali::Mutex::ScopedLock lock(mMutex);
 
-    auto triggeredHandler = std::find(mTriggeredHandlers.begin(), mTriggeredHandlers.end(), &handler);
+    auto triggeredHandler = mTriggeredHandlers.find(&handler);
     if(triggeredHandler != mTriggeredHandlers.end())
     {
       mTriggeredHandlers.erase(triggeredHandler);
@@ -106,6 +110,7 @@ void VectorAnimationPluginManager::RemoveEventHandler(VectorAnimationEventHandle
     if(releaseEventTrigger)
     {
       mEventTrigger.reset();
+      mEventTriggered = false;
     }
   }
 }
@@ -114,13 +119,14 @@ void VectorAnimationPluginManager::TriggerEvent(VectorAnimationEventHandler& han
 {
   Dali::Mutex::ScopedLock lock(mMutex);
 
-  if(mTriggeredHandlers.end() == std::find(mTriggeredHandlers.begin(), mTriggeredHandlers.end(), &handler))
+  if(mTriggeredHandlers.end() == mTriggeredHandlers.find(&handler))
   {
-    mTriggeredHandlers.push_back(&handler);
+    mTriggeredHandlers.insert({&handler, mTriggerOrderId++});
 
-    if(mEventTrigger)
+    if(mEventTrigger && !mEventTriggered)
     {
       mEventTrigger->Trigger();
+      mEventTriggered = true;
     }
   }
 }
@@ -133,23 +139,37 @@ void VectorAnimationPluginManager::Process(bool postProcessor)
 // This function is called in the main thread.
 void VectorAnimationPluginManager::OnEventTriggered()
 {
-  std::vector<VectorAnimationEventHandler*> handlers;
+  std::map<uint32_t, VectorAnimationEventHandler*> handlers;
+
+  decltype(mTriggeredHandlers) movedTriggeredHandlers;
 
   {
     Dali::Mutex::ScopedLock lock(mMutex);
 
     // Copy the list to the local variable and clear
-    handlers = mTriggeredHandlers;
+    movedTriggeredHandlers = std::move(mTriggeredHandlers);
     mTriggeredHandlers.clear();
+    mTriggeredHandlers.rehash(0u);
+
+    mTriggerOrderId = 0u;
+    mEventTriggered = false;
+  }
+
+  // Reorder event handler ordered by trigger request.
+  for(auto&& iter : movedTriggeredHandlers)
+  {
+    handlers[iter.second] = iter.first;
   }
+  movedTriggeredHandlers.clear();
 
   for(auto&& iter : handlers)
   {
+    auto* handler = iter.second;
+
     // Check if it is valid
-    auto handler = std::find(mEventHandlers.begin(), mEventHandlers.end(), iter);
-    if(handler != mEventHandlers.end())
+    if(mEventHandlers.end() != mEventHandlers.find(handler))
     {
-      iter->NotifyEvent();
+      handler->NotifyEvent();
     }
   }
 }
index 540d48e..e9b136c 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_VECTOR_ANIMATION_PLUGIN_MANAGER_H
 
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,6 +24,8 @@
 #include <dali/integration-api/processor-interface.h>
 #include <dali/public-api/common/vector-wrapper.h>
 #include <memory>
+#include <unordered_map>
+#include <unordered_set>
 
 // INTERNAL INCLUDES
 #include <dali-extension/vector-animation-renderer/vector-animation-event-handler.h>
@@ -102,10 +104,13 @@ private:
   VectorAnimationPluginManager& operator=(const VectorAnimationPluginManager&) = delete;
 
 private:
-  std::vector<VectorAnimationEventHandler*> mEventHandlers;
-  std::vector<VectorAnimationEventHandler*> mTriggeredHandlers;
-  Dali::Mutex                               mMutex;
-  std::unique_ptr<EventThreadCallback>      mEventTrigger;
+  std::unordered_set<VectorAnimationEventHandler*>           mEventHandlers;
+  std::unordered_map<VectorAnimationEventHandler*, uint32_t> mTriggeredHandlers; ///< first : trigger handler, second : trigger order.
+  uint32_t                                                   mTriggerOrderId;    ///< Be used when we need to determine the order of trigger handler.
+
+  Dali::Mutex                          mMutex;
+  std::unique_ptr<EventThreadCallback> mEventTrigger;
+  bool                                 mEventTriggered : 1;
 };
 
 } // namespace Plugin