ComponentData改用SharedPtr保存,这样在复制Component时,不会对数据产生真正的复制

This commit is contained in:
hyzboy 2025-06-17 00:34:42 +08:00
parent dd083bb82b
commit 7d41722baa
6 changed files with 70 additions and 48 deletions

View File

@ -50,9 +50,9 @@ public:
ComponentData()=default; ComponentData()=default;
virtual ~ComponentData()=default; virtual ~ComponentData()=default;
};//struct ComponentData
virtual ComponentData *Duplication()=0; using ComponentDataPtr=SharedPtr<ComponentData>;
};
/** /**
* <br> * <br>
@ -66,7 +66,7 @@ class Component
SceneNode * OwnerNode; SceneNode * OwnerNode;
ComponentManager * Manager; ComponentManager * Manager;
ComponentData * Data; ComponentDataPtr Data;
protected: protected:
@ -81,7 +81,7 @@ protected:
public: public:
Component()=delete; Component()=delete;
Component(ComponentData *,ComponentManager *); Component(ComponentDataPtr,ComponentManager *);
virtual ~Component(); virtual ~Component();
virtual const size_t GetHashCode()const=0; virtual const size_t GetHashCode()const=0;
@ -92,7 +92,7 @@ public:
SceneNode * GetOwnerNode()const{return OwnerNode;} SceneNode * GetOwnerNode()const{return OwnerNode;}
ComponentManager * GetManager ()const{return Manager;} ComponentManager * GetManager ()const{return Manager;}
ComponentData * GetData ()const{return Data;} ComponentDataPtr GetData ()const{return Data;}
public: public:
@ -137,7 +137,7 @@ public:
public: public:
virtual Component * CreateComponent(ComponentData *)=0; virtual Component * CreateComponent(ComponentDataPtr)=0;
const size_t GetComponentCount()const{return component_set.GetCount();} const size_t GetComponentCount()const{return component_set.GetCount();}
@ -153,6 +153,12 @@ public: //事件
virtual void OnFocusGained(){} ///<焦点获得事件 virtual void OnFocusGained(){} ///<焦点获得事件
};//class ComponentManager };//class ComponentManager
#define COMPONENT_MANAGER_CLASS_BODY(name) static name##ComponentManager * GetDefaultManager () {return GetComponentManager<name##ComponentManager>(true);} \
static constexpr const size_t StaticHashCode () {return hgl::GetTypeHash<name##ComponentManager>();} \
static constexpr const size_t StaticComponentHashCode () {return hgl::GetTypeHash<name##Component>();} \
const size_t GetComponentHashCode ()const override{return name##ComponentManager::StaticComponentHashCode();} \
const size_t GetHashCode ()const override{return name##ComponentManager::StaticHashCode();} \
bool RegistryComponentManager(ComponentManager *); bool RegistryComponentManager(ComponentManager *);
ComponentManager *GetComponentManager(const size_t hash_code); ComponentManager *GetComponentManager(const size_t hash_code);

View File

@ -3,10 +3,16 @@
#include<hgl/component/RenderComponent.h> #include<hgl/component/RenderComponent.h>
#include<hgl/graph/Mesh.h> #include<hgl/graph/Mesh.h>
//#include<hgl/log/LogInfo.h>
COMPONENT_NAMESPACE_BEGIN COMPONENT_NAMESPACE_BEGIN
struct MeshComponentData:public ComponentData struct MeshComponentData:public ComponentData
{ {
//static uint unique_id_count;
//uint unique_id;
Mesh *mesh; Mesh *mesh;
public: public:
@ -14,19 +20,20 @@ public:
MeshComponentData() MeshComponentData()
{ {
mesh=nullptr; mesh=nullptr;
// unique_id=++unique_id_count;
// LOG_INFO(AnsiString("MeshComponentData():")+AnsiString::numberOf(unique_id));
} }
MeshComponentData(Mesh *m) MeshComponentData(Mesh *m)
{ {
mesh=m; mesh=m;
// unique_id=++unique_id_count;
// LOG_INFO(AnsiString("MeshComponentData(Mesh *):")+AnsiString::numberOf(unique_id));
} }
virtual ~MeshComponentData(); virtual ~MeshComponentData();
ComponentData *Duplication() override
{
return(new MeshComponentData(mesh));
}
};//struct MeshComponentData };//struct MeshComponentData
class MeshComponent; class MeshComponent;
@ -35,36 +42,20 @@ class MeshComponentManager:public ComponentManager
{ {
public: public:
static MeshComponentManager *GetDefaultManager() COMPONENT_MANAGER_CLASS_BODY(Mesh)
{
return GetComponentManager<MeshComponentManager>(true);
}
static constexpr const size_t StaticHashCode (){return hgl::GetTypeHash<MeshComponentManager>();}
static constexpr const size_t StaticComponentHashCode (){return hgl::GetTypeHash<MeshComponent>();}
const size_t GetComponentHashCode ()const override{return MeshComponentManager::StaticComponentHashCode();}
const size_t GetHashCode ()const override{return MeshComponentManager::StaticHashCode();}
public: public:
MeshComponentManager()=default; MeshComponentManager()=default;
MeshComponent *CreateComponent(MeshComponentData *data); Component *CreateComponent(ComponentDataPtr cdp) override;
MeshComponent *CreateComponent(Mesh *m) MeshComponent *CreateComponent(Mesh *);
{
auto sm_cd=new MeshComponentData(m);
return CreateComponent(sm_cd);
}
virtual Component *CreateComponent(ComponentData *data) override;
};//class MeshComponentManager };//class MeshComponentManager
class MeshComponent:public RenderComponent class MeshComponent:public RenderComponent
{ {
MeshComponentData *sm_data; WeakPtr<ComponentData> sm_data;
public: public:
@ -72,14 +63,28 @@ public:
public: public:
MeshComponent(MeshComponentData *cd,MeshComponentManager *cm):RenderComponent(cd,cm){sm_data=cd;} MeshComponent(ComponentDataPtr cdp,MeshComponentManager *cm):RenderComponent(cdp,cm)
{
sm_data=cdp;
}
virtual ~MeshComponent()=default; virtual ~MeshComponent()=default;
MeshComponentData &GetData() {return *sm_data;} MeshComponentData *GetData() {return dynamic_cast< MeshComponentData *>(sm_data.get());}
const MeshComponentData &GetData()const {return *sm_data;} const MeshComponentData *GetData()const {return dynamic_cast<const MeshComponentData *>(sm_data.const_get());}
Mesh *GetMesh() const{return sm_data->mesh;} Mesh *GetMesh()const
{
if(!sm_data.valid())
return(nullptr);
const MeshComponentData *mcd=dynamic_cast<const MeshComponentData *>(sm_data.const_get());
if(!mcd)
return(nullptr);
return mcd->mesh;
}
};//class MeshComponent };//class MeshComponent
COMPONENT_NAMESPACE_END COMPONENT_NAMESPACE_END

View File

@ -6,12 +6,12 @@ namespace hgl::graph
{ {
uint Component::unique_id_count=0; uint Component::unique_id_count=0;
Component::Component(ComponentData *cd,ComponentManager *cm) Component::Component(ComponentDataPtr cdp,ComponentManager *cm)
{ {
unique_id=++unique_id_count; unique_id=++unique_id_count;
OwnerNode=nullptr; OwnerNode=nullptr;
Data=cd; Data=cdp;
Manager=cm; Manager=cm;
Manager->AttachComponent(this); Manager->AttachComponent(this);
@ -31,12 +31,10 @@ namespace hgl::graph
if(Manager) if(Manager)
Manager->DetachComponent(this); Manager->DetachComponent(this);
SAFE_CLEAR(Data);
} }
Component *Component::Duplication() Component *Component::Duplication()
{ {
return GetManager()->CreateComponent(Data?Data->Duplication():nullptr); return GetManager()->CreateComponent(Data);
} }
}//namespace hgl::graph }//namespace hgl::graph

View File

@ -4,8 +4,12 @@
COMPONENT_NAMESPACE_BEGIN COMPONENT_NAMESPACE_BEGIN
//uint MeshComponentData::unique_id_count=0;
MeshComponentData::~MeshComponentData() MeshComponentData::~MeshComponentData()
{ {
// LOG_INFO(AnsiString("~MeshComponentData():")+AnsiString::numberOf(unique_id));
if(mesh) if(mesh)
{ {
//mesh->Release(); //外面有RenderResource管理不需要在这里释放.但未来要考虑是增加Release函数通知这里释放了一次使用权 //mesh->Release(); //外面有RenderResource管理不需要在这里释放.但未来要考虑是增加Release函数通知这里释放了一次使用权
@ -13,18 +17,24 @@ MeshComponentData::~MeshComponentData()
} }
} }
Component *MeshComponentManager::CreateComponent(ComponentData *data) Component *MeshComponentManager::CreateComponent(ComponentDataPtr cdp)
{ {
if(!data)return(nullptr); if(!cdp)return(nullptr);
return CreateComponent(reinterpret_cast<MeshComponentData *>(data)); if(!dynamic_cast<MeshComponentData *>(cdp.get()))
{
//LOG_ERROR(OS_TEXT("MeshComponentManager::CreateMeshComponent: invalid component data type."));
return(nullptr);
} }
MeshComponent *MeshComponentManager::CreateComponent(MeshComponentData *data) return(new MeshComponent(cdp,this));
{ }
if(!data)return(nullptr);
return(new MeshComponent(data,this)); MeshComponent *MeshComponentManager::CreateComponent(Mesh *m)
{
ComponentDataPtr cdp=new MeshComponentData(m);
return dynamic_cast<MeshComponent *>(CreateComponent(cdp));
} }
COMPONENT_NAMESPACE_END COMPONENT_NAMESPACE_END

View File

@ -28,7 +28,10 @@ namespace hgl
if(component->GetHashCode()!=MeshComponent::StaticHashCode()) //暂时只支持MeshComponent if(component->GetHashCode()!=MeshComponent::StaticHashCode()) //暂时只支持MeshComponent
continue; continue;
MeshComponent *smc=reinterpret_cast<MeshComponent *>(component); MeshComponent *smc=dynamic_cast<MeshComponent *>(component);
if(!smc)
continue;
Mesh *mesh=smc->GetMesh(); Mesh *mesh=smc->GetMesh();

View File

@ -61,7 +61,7 @@ namespace hgl::graph
for(Component *com:component_set) for(Component *com:component_set)
{ {
SceneComponent *sc=reinterpret_cast<SceneComponent *>(com); SceneComponent *sc=dynamic_cast<SceneComponent *>(com);
if(!sc) if(!sc)
continue; continue;