Patch - Adds component shutdown functionality - V13.6.1
Implements a shutdown mechanism for components and entities, ensuring proper resource release and preventing memory leaks. This change introduces a virtual `Shutdown` method to the `Component` class, allowing derived components to release specific resources when they are removed from an entity or when the entity is destroyed. The `Entity` class now calls the `Shutdown` method on all its components during its own release process. The `EntityManager` now calls the `release()` method when destroying an entity. This enhancement ensures that resources, such as FMOD sound objects and channels in the `AudioComponent`, are properly released, preventing potential resource leaks and improving the stability of the engine.
This commit is contained in:
38
.idea/.idea.KhaoticEngineReborn/.idea/workspace.xml
generated
38
.idea/.idea.KhaoticEngineReborn/.idea/workspace.xml
generated
@@ -62,26 +62,26 @@
|
|||||||
<option name="hideEmptyMiddlePackages" value="true" />
|
<option name="hideEmptyMiddlePackages" value="true" />
|
||||||
<option name="showLibraryContents" value="true" />
|
<option name="showLibraryContents" value="true" />
|
||||||
</component>
|
</component>
|
||||||
<component name="PropertiesComponent"><![CDATA[{
|
<component name="PropertiesComponent">{
|
||||||
"keyToString": {
|
"keyToString": {
|
||||||
"ASKED_SHARE_PROJECT_CONFIGURATION_FILES": "true",
|
"ASKED_SHARE_PROJECT_CONFIGURATION_FILES": "true",
|
||||||
"C++ Project.enginecustom.executor": "Run",
|
"C++ Project.enginecustom.executor": "Run",
|
||||||
"C/C++ Project.KhaoticDemo.executor": "Run",
|
"C/C++ Project.KhaoticDemo.executor": "Run",
|
||||||
"C/C++ Project.enginecustom.executor": "Run",
|
"C/C++ Project.enginecustom.executor": "Run",
|
||||||
"RunOnceActivity.ShowReadmeOnStart": "true",
|
"RunOnceActivity.ShowReadmeOnStart": "true",
|
||||||
"RunOnceActivity.git.unshallow": "true",
|
"RunOnceActivity.git.unshallow": "true",
|
||||||
"SHARE_PROJECT_CONFIGURATION_FILES": "true",
|
"SHARE_PROJECT_CONFIGURATION_FILES": "true",
|
||||||
"git-widget-placeholder": "main",
|
"git-widget-placeholder": "main",
|
||||||
"ignore.virus.scanning.warn.message": "true",
|
"ignore.virus.scanning.warn.message": "true",
|
||||||
"node.js.detected.package.eslint": "true",
|
"node.js.detected.package.eslint": "true",
|
||||||
"node.js.detected.package.tslint": "true",
|
"node.js.detected.package.tslint": "true",
|
||||||
"node.js.selected.package.eslint": "(autodetect)",
|
"node.js.selected.package.eslint": "(autodetect)",
|
||||||
"node.js.selected.package.tslint": "(autodetect)",
|
"node.js.selected.package.tslint": "(autodetect)",
|
||||||
"nodejs_package_manager_path": "npm",
|
"nodejs_package_manager_path": "npm",
|
||||||
"settings.editor.selected.configurable": "preferences.pluginManager",
|
"settings.editor.selected.configurable": "preferences.pluginManager",
|
||||||
"vue.rearranger.settings.migration": "true"
|
"vue.rearranger.settings.migration": "true"
|
||||||
}
|
}
|
||||||
}]]></component>
|
}</component>
|
||||||
<component name="RunManager" selected="C/C++ Project.enginecustom">
|
<component name="RunManager" selected="C/C++ Project.enginecustom">
|
||||||
<configuration name="KhaoticDemo" type="CppProject" factoryName="C++ Project">
|
<configuration name="KhaoticDemo" type="CppProject" factoryName="C++ Project">
|
||||||
<configuration_1 setup="1">
|
<configuration_1 setup="1">
|
||||||
|
|||||||
@@ -32,6 +32,11 @@ public:
|
|||||||
*/
|
*/
|
||||||
virtual void Initialize() {}
|
virtual void Initialize() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*Virtual function to shutdown the component.
|
||||||
|
*/
|
||||||
|
virtual void Shutdown() {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Virtual function to update the component.
|
* Virtual function to update the component.
|
||||||
* @param deltaTime Time since the last update.
|
* @param deltaTime Time since the last update.
|
||||||
|
|||||||
@@ -30,6 +30,27 @@ public:
|
|||||||
// Ne pas lib<69>rer m_system ici car il peut <20>tre partag<61>
|
// Ne pas lib<69>rer m_system ici car il peut <20>tre partag<61>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Shutdown the audio component by releasing the sound and channel.
|
||||||
|
* This method is called when the component is removed from an entity or when the entity is destroyed.
|
||||||
|
*/
|
||||||
|
void Shutdown() override {
|
||||||
|
if (m_channel) {
|
||||||
|
bool isPlaying = false;
|
||||||
|
m_channel->isPlaying(&isPlaying);
|
||||||
|
if (isPlaying) {
|
||||||
|
m_channel->stop();
|
||||||
|
}
|
||||||
|
m_channel = nullptr;
|
||||||
|
}
|
||||||
|
if (m_sound) {
|
||||||
|
m_sound->release();
|
||||||
|
m_sound = nullptr;
|
||||||
|
}
|
||||||
|
m_system = nullptr; // Ne pas lib<69>rer m_system ici car il peut <20>tre partag<61>
|
||||||
|
m_camera = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize the audio component by setting up the FMOD system and camera from the parent entity.
|
* Initialize the audio component by setting up the FMOD system and camera from the parent entity.
|
||||||
* This method is called when the component is added to an entity.
|
* This method is called when the component is added to an entity.
|
||||||
|
|||||||
@@ -163,6 +163,22 @@ public:
|
|||||||
*/
|
*/
|
||||||
FMOD::System* GetSoundSystem() const { return m_soundSystem; }
|
FMOD::System* GetSoundSystem() const { return m_soundSystem; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Release all data associated with the entity.
|
||||||
|
* This includes clearing all components and resetting the camera and sound system pointers.
|
||||||
|
*/
|
||||||
|
void release()
|
||||||
|
{
|
||||||
|
// call shutdown on all components if needed
|
||||||
|
for (auto& [typeID, component] : m_Components) {
|
||||||
|
// If components had a shutdown method, we would call it here
|
||||||
|
component->Shutdown();
|
||||||
|
}
|
||||||
|
m_Components.clear();
|
||||||
|
m_camera = nullptr;
|
||||||
|
m_soundSystem = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
void SetDevice (ID3D11Device* dev) { device = dev; }
|
void SetDevice (ID3D11Device* dev) { device = dev; }
|
||||||
void SetContext(ID3D11DeviceContext* ctx) { context = ctx; }
|
void SetContext(ID3D11DeviceContext* ctx) { context = ctx; }
|
||||||
ID3D11Device* GetDevice() const { return device; }
|
ID3D11Device* GetDevice() const { return device; }
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ public:
|
|||||||
void DestroyEntity(EntityID id) {
|
void DestroyEntity(EntityID id) {
|
||||||
auto it = m_Entities.find(id);
|
auto it = m_Entities.find(id);
|
||||||
if (it != m_Entities.end()) {
|
if (it != m_Entities.end()) {
|
||||||
|
it->second->release();
|
||||||
m_Entities.erase(it);
|
m_Entities.erase(it);
|
||||||
m_FreeIDs.push(id); // Recycler l'ID
|
m_FreeIDs.push(id); // Recycler l'ID
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user