From aded82d1ab87aa4f898e5ec7120513d4fba42120 Mon Sep 17 00:00:00 2001 From: jay602 <857024709@qq.com> Date: Wed, 16 Jan 2019 10:44:35 +0800 Subject: [PATCH 1/2] =?UTF-8?q?UE4=E6=8F=92=E4=BB=B6=E5=AF=B9=E9=A2=91?= =?UTF-8?q?=E7=B9=81new=E7=9A=84=E5=AF=B9=E8=B1=A1=E5=BA=94=E8=AF=A5?= =?UTF-8?q?=E7=94=A8=E5=AF=B9=E8=B1=A1=E6=B1=A0=20#974=20https://github.co?= =?UTF-8?q?m/kbengine/kbengine/issues/974?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Source/KBEnginePlugins/Engine/Bundle.cpp | 55 ++++++++++++++----- .../Source/KBEnginePlugins/Engine/Bundle.h | 2 + .../KBEnginePlugins/Engine/MemoryStream.cpp | 8 ++- .../KBEnginePlugins/Engine/ObjectPool.h | 43 +++++++++++++++ 4 files changed, 91 insertions(+), 17 deletions(-) create mode 100644 Plugins/kbengine_ue4_plugins/Source/KBEnginePlugins/Engine/ObjectPool.h diff --git a/Plugins/kbengine_ue4_plugins/Source/KBEnginePlugins/Engine/Bundle.cpp b/Plugins/kbengine_ue4_plugins/Source/KBEnginePlugins/Engine/Bundle.cpp index 154d2c3..2f8882c 100644 --- a/Plugins/kbengine_ue4_plugins/Source/KBEnginePlugins/Engine/Bundle.cpp +++ b/Plugins/kbengine_ue4_plugins/Source/KBEnginePlugins/Engine/Bundle.cpp @@ -4,6 +4,9 @@ #include "Messages.h" #include "NetworkInterfaceBase.h" #include "KBDebug.h" +#include "ObjectPool.h" + +static ObjectPool _g_objPool; Bundle::Bundle(): pCurrPacket_(NULL), @@ -18,18 +21,29 @@ Bundle::Bundle(): Bundle::~Bundle() { - MemoryStream::reclaimObject(pCurrPacket_); - pCurrPacket_ = NULL; + if (pCurrPacket_) + { + delete pCurrPacket_; + pCurrPacket_ = NULL; + } + + for (int i = 0; i < streams_.Num(); ++i) + { + delete streams_[i]; + } + + streams_.Empty(); } Bundle* Bundle::createObject() { - return new Bundle(); + return _g_objPool.createObject(); } void Bundle::reclaimObject(Bundle* obj) { - delete obj; + obj->clear(); + _g_objPool.reclaimObject(obj); } void Bundle::newMessage(Message* pMsg) @@ -87,17 +101,6 @@ void Bundle::send(NetworkInterfaceBase* pNetworkInterface) ERROR_MSG("Bundle::send(): networkInterface invalid!"); } - // 把不用的MemoryStream放回缓冲池,以减少垃圾回收的消耗 - for (int i = 0; i < streams_.Num(); ++i) - { - MemoryStream::reclaimObject(streams_[i]); - } - - streams_.Empty(); - - if(pCurrPacket_) - pCurrPacket_->clear(true); - // 我们认为,发送完成,就视为这个bundle不再使用了, // 所以我们会把它放回对象池,以减少垃圾回收带来的消耗, // 如果需要继续使用,应该重新Bundle.createObject(), @@ -135,6 +138,28 @@ void Bundle::checkStream(uint32 v) messageLength_ += v; } +void Bundle::clear() +{ + // 把不用的MemoryStream放回缓冲池,以减少垃圾回收的消耗 + for (int i = 0; i < streams_.Num(); ++i) + { + if(pCurrPacket_ != streams_[i]) + MemoryStream::reclaimObject(streams_[i]); + } + + streams_.Empty(); + + if (pCurrPacket_) + pCurrPacket_->clear(false); + else + pCurrPacket_ = MemoryStream::createObject(); + + numMessage_ = 0; + messageLength_ = 0; + pMsgtype_ = NULL; + curMsgStreamIndex_ = 0; +} + Bundle &Bundle::operator<<(uint8 value) { checkStream(sizeof(uint8)); diff --git a/Plugins/kbengine_ue4_plugins/Source/KBEnginePlugins/Engine/Bundle.h b/Plugins/kbengine_ue4_plugins/Source/KBEnginePlugins/Engine/Bundle.h index 8094744..ba8bd0a 100644 --- a/Plugins/kbengine_ue4_plugins/Source/KBEnginePlugins/Engine/Bundle.h +++ b/Plugins/kbengine_ue4_plugins/Source/KBEnginePlugins/Engine/Bundle.h @@ -31,6 +31,8 @@ class KBENGINEPLUGINS_API Bundle void checkStream(uint32 v); + void clear(); + public: Bundle &operator<<(uint8 value); Bundle &operator<<(uint16 value); diff --git a/Plugins/kbengine_ue4_plugins/Source/KBEnginePlugins/Engine/MemoryStream.cpp b/Plugins/kbengine_ue4_plugins/Source/KBEnginePlugins/Engine/MemoryStream.cpp index e858c4a..34fe27a 100644 --- a/Plugins/kbengine_ue4_plugins/Source/KBEnginePlugins/Engine/MemoryStream.cpp +++ b/Plugins/kbengine_ue4_plugins/Source/KBEnginePlugins/Engine/MemoryStream.cpp @@ -1,15 +1,19 @@ #include "MemoryStream.h" #include "KBDebug.h" +#include "ObjectPool.h" + +static ObjectPool _g_objPool; MemoryStream* MemoryStream::createObject() { - return new MemoryStream(); + return _g_objPool.createObject(); } void MemoryStream::reclaimObject(MemoryStream* obj) { - delete obj; + obj->clear(false); + _g_objPool.reclaimObject(obj); } void MemoryStream::print_storage() diff --git a/Plugins/kbengine_ue4_plugins/Source/KBEnginePlugins/Engine/ObjectPool.h b/Plugins/kbengine_ue4_plugins/Source/KBEnginePlugins/Engine/ObjectPool.h new file mode 100644 index 0000000..bd144b9 --- /dev/null +++ b/Plugins/kbengine_ue4_plugins/Source/KBEnginePlugins/Engine/ObjectPool.h @@ -0,0 +1,43 @@ +#pragma once + +//#include "List.h" + +template +class ObjectPool +{ +public: + ~ObjectPool() + { + while (objects_.Num() > 0) + { + TDoubleLinkedList< T* >::TDoubleLinkedListNode* node = objects_.GetHead(); + T* t = node->GetValue(); + delete t; + objects_.RemoveNode(node); + } + } + + T* createObject() + { + if (objects_.Num() > 0) + { + TDoubleLinkedList< T* >::TDoubleLinkedListNode* node = objects_.GetHead(); + T* t = node->GetValue(); + objects_.RemoveNode(node); + return t; + } + else + { + T* t = new T(); + return t; + } + } + + void reclaimObject(T* obj) + { + objects_.AddTail(obj); + } + +private: + TDoubleLinkedList< T* > objects_; +}; From 18c72bf0099eb1dfc0c236cd2fbe71e5ab266752 Mon Sep 17 00:00:00 2001 From: jay602 <857024709@qq.com> Date: Wed, 16 Jan 2019 17:31:36 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=8F=92=E4=BB=B6=E5=8F=91=E9=80=81?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E5=8F=AF=E8=83=BD=E6=B3=84=E9=9C=B2=20#998?= =?UTF-8?q?=20https://github.com/kbengine/kbengine/issues/998?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Source/KBEnginePlugins/Engine/Bundle.cpp | 6 +++--- .../Source/KBEnginePlugins/Engine/MemoryStream.cpp | 6 +++--- .../Source/KBEnginePlugins/Engine/ObjectPool.h | 2 -- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/Plugins/kbengine_ue4_plugins/Source/KBEnginePlugins/Engine/Bundle.cpp b/Plugins/kbengine_ue4_plugins/Source/KBEnginePlugins/Engine/Bundle.cpp index 2f8882c..ff33131 100644 --- a/Plugins/kbengine_ue4_plugins/Source/KBEnginePlugins/Engine/Bundle.cpp +++ b/Plugins/kbengine_ue4_plugins/Source/KBEnginePlugins/Engine/Bundle.cpp @@ -6,7 +6,7 @@ #include "KBDebug.h" #include "ObjectPool.h" -static ObjectPool _g_objPool; +static ObjectPool _g_bundlePool; Bundle::Bundle(): pCurrPacket_(NULL), @@ -37,13 +37,13 @@ Bundle::~Bundle() Bundle* Bundle::createObject() { - return _g_objPool.createObject(); + return _g_bundlePool.createObject(); } void Bundle::reclaimObject(Bundle* obj) { obj->clear(); - _g_objPool.reclaimObject(obj); + _g_bundlePool.reclaimObject(obj); } void Bundle::newMessage(Message* pMsg) diff --git a/Plugins/kbengine_ue4_plugins/Source/KBEnginePlugins/Engine/MemoryStream.cpp b/Plugins/kbengine_ue4_plugins/Source/KBEnginePlugins/Engine/MemoryStream.cpp index 34fe27a..9dd5a69 100644 --- a/Plugins/kbengine_ue4_plugins/Source/KBEnginePlugins/Engine/MemoryStream.cpp +++ b/Plugins/kbengine_ue4_plugins/Source/KBEnginePlugins/Engine/MemoryStream.cpp @@ -3,17 +3,17 @@ #include "KBDebug.h" #include "ObjectPool.h" -static ObjectPool _g_objPool; +static ObjectPool _g_memoryStreamPool; MemoryStream* MemoryStream::createObject() { - return _g_objPool.createObject(); + return _g_memoryStreamPool.createObject(); } void MemoryStream::reclaimObject(MemoryStream* obj) { obj->clear(false); - _g_objPool.reclaimObject(obj); + _g_memoryStreamPool.reclaimObject(obj); } void MemoryStream::print_storage() diff --git a/Plugins/kbengine_ue4_plugins/Source/KBEnginePlugins/Engine/ObjectPool.h b/Plugins/kbengine_ue4_plugins/Source/KBEnginePlugins/Engine/ObjectPool.h index bd144b9..81d5db0 100644 --- a/Plugins/kbengine_ue4_plugins/Source/KBEnginePlugins/Engine/ObjectPool.h +++ b/Plugins/kbengine_ue4_plugins/Source/KBEnginePlugins/Engine/ObjectPool.h @@ -1,7 +1,5 @@ #pragma once -//#include "List.h" - template class ObjectPool {