Source/ObjectPool/ObjectPool.Build.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Source/ObjectPool/Private/ObjectPool.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Source/ObjectPool/Private/UserWidgetObjectPool.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Source/ObjectPool/Public/BaseUObjectPool.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Source/ObjectPool/Public/BaseUserWidgetObjectPool.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
Source/ObjectPool/ObjectPool.Build.cs
@@ -39,6 +39,7 @@ "Slate", "SlateCore", "UMG", // "UnrealEd", // ... add private dependencies that you statically link with here ... } ); @@ -50,5 +51,10 @@ // ... add any modules that your module loads dynamically here ... } ); if (Target.Type == TargetRules.TargetType.Editor) { PublicDependencyModuleNames.AddRange(new string[] { "UnrealEd" }); } } } Source/ObjectPool/Private/ObjectPool.cpp
@@ -2,6 +2,8 @@ #include "ObjectPool.h" // #include "Editor.h" #define LOCTEXT_NAMESPACE "FObjectPoolModule" void FObjectPoolModule::StartupModule() Source/ObjectPool/Private/UserWidgetObjectPool.cpp
@@ -2,3 +2,5 @@ #include "UserWidgetObjectPool.h" Source/ObjectPool/Public/BaseUObjectPool.h
@@ -37,32 +37,34 @@ */ virtual void InitPointer(); /** * @brief 清理所需的指针,在GameInstance被销毁时调用 * @brief 清理所需的指针,在GameInstance被销毁时(Shutdown)时调用 */ virtual void ClearPointer(); protected: virtual T* CreateNewObject(); /** * @brief 还在栈内的数据 */ TArray<T*> ArrayData; /** * @brief 所有数据 */ TArray<T*> TotalArrayData; }; template <typename T> T* BaseUObjectPool<T>::Pop_Impl() { if (ArrayData.Num() != 0) { const auto r = ArrayData.Pop(); OnPrePop_Impl(r); return r; } else { const auto r = CreateNewObject(); OnPrePop_Impl(r); return r; } T* r = ArrayData.Num() == 0 ? CreateNewObject() : ArrayData.Pop(); OnPrePop_Impl(r); const auto o = reinterpret_cast<UObject*>(r); o->AddToRoot(); TotalArrayData.AddUnique(r); return r; } template <typename T> @@ -96,10 +98,16 @@ template <typename T> void BaseUObjectPool<T>::ClearPointer() { for (const auto o : TotalArrayData) { reinterpret_cast<UObject*>(o)->RemoveFromRoot(); } } template <typename T> T* BaseUObjectPool<T>::CreateNewObject() { const auto o = NewObject<T>(); reinterpret_cast<UObject*>(o)->AddToRoot(); return NewObject<T>(); } Source/ObjectPool/Public/BaseUserWidgetObjectPool.h
@@ -7,13 +7,8 @@ { public: virtual T* CreateNewObject() override; // virtual void OnPrePop_Impl(T* t) override; // virtual void OnPrePush_Impl(T* t) override; public: APlayerController* PlayerController = nullptr; TSubclassOf<UUserWidget> UserWidgetCls = nullptr; // int32 ZOrder = 1024; }; template <typename T> @@ -21,17 +16,8 @@ { check(PlayerController) check(UserWidgetCls) return reinterpret_cast<T*>(CreateWidget(PlayerController,UserWidgetCls)); const auto r = reinterpret_cast<T*>(CreateWidget(PlayerController,UserWidgetCls)); reinterpret_cast<UObject*>(r)->AddToRoot(); this->TotalArrayData.Add(r); return r; } // template <typename T> // void BaseUserWidgetObjectPool<T>::OnPrePop_Impl(T* t) // { // reinterpret_cast<UUserWidget*>(t)->AddToViewport(ZOrder); // } // // template <typename T> // void BaseUserWidgetObjectPool<T>::OnPrePush_Impl(T* t) // { // reinterpret_cast<UUserWidget*>(t)->RemoveFromParent(); // }