diff --git a/Plugins/kbengine_ue4_plugins/Source/KBEnginePlugins/Engine/Bundle.cpp b/Plugins/kbengine_ue4_plugins/Source/KBEnginePlugins/Engine/Bundle.cpp index 154d2c3..ff33131 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_bundlePool; 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_bundlePool.createObject(); } void Bundle::reclaimObject(Bundle* obj) { - delete obj; + obj->clear(); + _g_bundlePool.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..9dd5a69 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_memoryStreamPool; MemoryStream* MemoryStream::createObject() { - return new MemoryStream(); + return _g_memoryStreamPool.createObject(); } void MemoryStream::reclaimObject(MemoryStream* obj) { - delete obj; + obj->clear(false); + _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 new file mode 100644 index 0000000..81d5db0 --- /dev/null +++ b/Plugins/kbengine_ue4_plugins/Source/KBEnginePlugins/Engine/ObjectPool.h @@ -0,0 +1,41 @@ +#pragma once + +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_; +};