From 0bb653d9858ab6355c83df0f2c2cf041330d0e1c Mon Sep 17 00:00:00 2001 From: Attila Uygun Date: Thu, 28 Oct 2021 22:20:53 +0200 Subject: [PATCH] Code cleanup --- src/demo/enemy.cc | 2 +- src/demo/enemy.h | 2 +- src/engine/engine.cc | 47 +++++++++++++++++++++------------- src/engine/engine.h | 6 +++-- src/engine/image_quad.cc | 17 ++++++++---- src/engine/image_quad.h | 11 ++++---- src/engine/renderer/texture.cc | 2 +- 7 files changed, 53 insertions(+), 34 deletions(-) diff --git a/src/demo/enemy.cc b/src/demo/enemy.cc index bfcc395..ae4f3ab 100644 --- a/src/demo/enemy.cc +++ b/src/demo/enemy.cc @@ -420,7 +420,7 @@ void Enemy::StopAllEnemyUnits(bool chromatic_aberration_effect) { continue; if (chromatic_aberration_effect) { - e.sprite.SetCustomShader(chromatic_aberration_); + e.sprite.SetCustomShader(chromatic_aberration_.get()); e.chromatic_aberration_active_ = true; } diff --git a/src/demo/enemy.h b/src/demo/enemy.h index d2bd47d..2172753 100644 --- a/src/demo/enemy.h +++ b/src/demo/enemy.h @@ -106,7 +106,7 @@ class Enemy { eng::SoundPlayer hit; }; - std::shared_ptr chromatic_aberration_; + std::unique_ptr chromatic_aberration_; float chromatic_aberration_offset_ = 0; eng::ImageQuad boss_; diff --git a/src/engine/engine.cc b/src/engine/engine.cc index fa421d0..7ecea31 100644 --- a/src/engine/engine.cc +++ b/src/engine/engine.cc @@ -37,13 +37,10 @@ Engine::Engine(Platform* platform, Renderer* renderer, Audio* audio) solid_shader_ = CreateRenderResource(); stats_ = std::make_unique(); - stats_->SetZOrder(std::numeric_limits::max()); } Engine::~Engine() { - game_.reset(); stats_.reset(); - singleton = nullptr; } @@ -91,6 +88,7 @@ bool Engine::Initialize() { return false; SetImageSource("stats_tex", std::bind(&Engine::PrintStats, this)); + stats_->SetZOrder(std::numeric_limits::max()); game_ = GameFactoryBase::CreateGame(""); if (!game_) { @@ -108,6 +106,9 @@ bool Engine::Initialize() { void Engine::Shutdown() { LOG << "Shutting down engine."; + game_.reset(); + stats_->Destory(); + textures_.clear(); } void Engine::Update(float delta_time) { @@ -119,12 +120,6 @@ void Engine::Update(float delta_time) { game_->Update(delta_time); - // Destroy unused textures. - for (auto& t : textures_) { - if (!t.second.persistent && t.second.texture.use_count() == 1) - t.second.texture->Destroy(); - } - fps_seconds_ += delta_time; if (fps_seconds_ >= 1) { fps_ = renderer_->GetAndResetFPS(); @@ -227,15 +222,16 @@ void Engine::SetImageSource(const std::string& asset_name, void Engine::SetImageSource(const std::string& asset_name, CreateImageCB create_image, bool persistent) { - std::shared_ptr texture; + Texture* texture; auto it = textures_.find(asset_name); if (it != textures_.end()) { - texture = it->second.texture; + texture = it->second.texture.get(); it->second.create_image = create_image; it->second.persistent = persistent; } else { - texture = CreateRenderResource(); - textures_[asset_name] = {texture, create_image, persistent}; + auto& t = textures_[asset_name] = {CreateRenderResource(), + create_image, persistent, 0}; + texture = t.texture.get(); } if (persistent) { @@ -259,18 +255,33 @@ void Engine::RefreshImage(const std::string& asset_name) { it->second.texture->Destroy(); } -std::shared_ptr Engine::GetTexture(const std::string& asset_name) { +Texture* Engine::AcquireTexture(const std::string& asset_name) { auto it = textures_.find(asset_name); if (it != textures_.end()) { if (!it->second.texture->IsValid()) RefreshImage(it->first); - return it->second.texture; + it->second.use_count++; + return it->second.texture.get(); } - std::shared_ptr texture = CreateRenderResource(); - textures_[asset_name] = {texture}; + auto& t = textures_[asset_name] = {CreateRenderResource(), nullptr, + false, 1}; + return t.texture.get(); +} - return texture; +void Engine::ReleaseTexture(const std::string& asset_name) { + auto it = textures_.find(asset_name); + if (it == textures_.end()) + return; + + if (it->second.use_count == 0) { + DCHECK(!it->second.texture->IsValid()); + return; + } + + it->second.use_count--; + if (!it->second.persistent && it->second.use_count == 0) + it->second.texture->Destroy(); } void Engine::AddInputEvent(std::unique_ptr event) { diff --git a/src/engine/engine.h b/src/engine/engine.h index 08091de..a01077e 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -76,7 +76,8 @@ class Engine { void RefreshImage(const std::string& asset_name); - std::shared_ptr GetTexture(const std::string& asset_name); + Texture* AcquireTexture(const std::string& asset_name); + void ReleaseTexture(const std::string& asset_name); void AddInputEvent(std::unique_ptr event); std::unique_ptr GetNextInputEvent(); @@ -151,9 +152,10 @@ class Engine { // Class holding information about texture resources managed by engine. // Texture is created from the image returned by create_image callback. struct TextureResource { - std::shared_ptr texture; + std::unique_ptr texture; CreateImageCB create_image; bool persistent = false; + size_t use_count = 0; }; static Engine* singleton; diff --git a/src/engine/image_quad.cc b/src/engine/image_quad.cc index d8a7d1c..ee9caa2 100644 --- a/src/engine/image_quad.cc +++ b/src/engine/image_quad.cc @@ -10,11 +10,17 @@ using namespace base; namespace eng { +ImageQuad::ImageQuad() = default; + +ImageQuad::~ImageQuad() { + Destory(); +} + void ImageQuad::Create(const std::string& asset_name, std::array num_frames, int frame_width, int frame_height) { - texture_ = Engine::Get().GetTexture(asset_name); + texture_ = Engine::Get().AcquireTexture(asset_name); num_frames_ = std::move(num_frames); frame_width_ = frame_width; @@ -27,7 +33,8 @@ void ImageQuad::Create(const std::string& asset_name, } void ImageQuad::Destory() { - texture_.reset(); + Engine::Get().ReleaseTexture(asset_name_); + texture_ = nullptr; } void ImageQuad::AutoScale() { @@ -40,7 +47,7 @@ void ImageQuad::AutoScale() { SetSize(size); } -void ImageQuad::SetCustomShader(std::shared_ptr shader) { +void ImageQuad::SetCustomShader(Shader* shader) { custom_shader_ = shader; custom_uniforms_.clear(); } @@ -66,8 +73,8 @@ void ImageQuad::Draw(float frame_frac) { Vector2f tex_scale = {GetFrameWidth() / texture_->GetWidth(), GetFrameHeight() / texture_->GetHeight()}; - Shader* shader = custom_shader_ ? custom_shader_.get() - : Engine::Get().GetPassThroughShader(); + Shader* shader = + custom_shader_ ? custom_shader_ : Engine::Get().GetPassThroughShader(); shader->Activate(); shader->SetUniform("offset", position_); diff --git a/src/engine/image_quad.h b/src/engine/image_quad.h index 1ef4960..5ad4fbb 100644 --- a/src/engine/image_quad.h +++ b/src/engine/image_quad.h @@ -2,7 +2,6 @@ #define ENGINE_IMAGE_QUAD_H #include -#include #include #include #include @@ -17,8 +16,8 @@ class Texture; class ImageQuad : public Animatable { public: - ImageQuad() = default; - ~ImageQuad() override = default; + ImageQuad(); + ~ImageQuad() override; void Create(const std::string& asset_name, std::array num_frames = {1, 1}, @@ -29,7 +28,7 @@ class ImageQuad : public Animatable { void AutoScale(); - void SetCustomShader(std::shared_ptr shader); + void SetCustomShader(Shader* shader); template void SetCustomUniform(const std::string& name, T value) { @@ -54,9 +53,9 @@ class ImageQuad : public Animatable { float, int>; - std::shared_ptr texture_; + Texture* texture_ = nullptr; - std::shared_ptr custom_shader_; + Shader* custom_shader_ = nullptr; std::unordered_map custom_uniforms_; size_t current_frame_ = 0; diff --git a/src/engine/renderer/texture.cc b/src/engine/renderer/texture.cc index 8665781..c09bed6 100644 --- a/src/engine/renderer/texture.cc +++ b/src/engine/renderer/texture.cc @@ -22,9 +22,9 @@ void Texture::Update(std::unique_ptr image) { void Texture::Destroy() { if (IsValid()) { + DLOG << "Texture destroyed. resource_id: " << resource_id_; renderer_->DestroyTexture(resource_id_); resource_id_ = 0; - DLOG << "Texture destroyed. resource_id: " << resource_id_; } }