From a1a484163f1b13298c4aa5c772f3bf1805eb3cb8 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 30 Oct 2022 10:44:33 -0700 Subject: [PATCH] Replacement: Don't double count memory usage. --- Core/TextureReplacer.cpp | 39 ++++++++++++++++++--------------------- Core/TextureReplacer.h | 3 +-- 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/Core/TextureReplacer.cpp b/Core/TextureReplacer.cpp index 6c6e78d579..a234ada347 100644 --- a/Core/TextureReplacer.cpp +++ b/Core/TextureReplacer.cpp @@ -847,9 +847,14 @@ void TextureReplacer::Decimate(ReplacerDecimateMode mode) { } const double threshold = time_now_d() - age; - size_t totalSize = 0; for (auto &item : cache_) { - totalSize += item.second.PurgeIfOlder(threshold); + item.second.PurgeIfOlder(threshold); + } + + size_t totalSize = 0; + for (auto &item : levelCache_) { + std::lock_guard guard(item.second.lock); + totalSize += item.second.data.size(); } double totalSizeGB = totalSize / (1024.0 * 1024.0 * 1024.0); @@ -1211,29 +1216,21 @@ void ReplacedTexture::PrepareData(int level) { cleanup(); } -size_t ReplacedTexture::PurgeIfOlder(double t) { +void ReplacedTexture::PurgeIfOlder(double t) { if (threadWaitable_ && !threadWaitable_->WaitFor(0.0)) - return 0; + return; + if (lastUsed_ >= t) + return; - if (lastUsed_ < t) { - for (auto &l : levelData_) { - if (l->lastUsed < t) { - // We have to lock since multiple textures might reference this same data. - std::lock_guard guard(l->lock); - l->data.clear(); - // This means we have to reload. If we never purge any, there's no need. - initDone_ = false; - } - } - return 0; - } - - size_t s = 0; for (auto &l : levelData_) { - std::lock_guard guard(l->lock); - s += l->data.size(); + if (l->lastUsed < t) { + // We have to lock since multiple textures might reference this same data. + std::lock_guard guard(l->lock); + l->data.clear(); + // This means we have to reload. If we never purge any, there's no need. + initDone_ = false; + } } - return s; } ReplacedTexture::~ReplacedTexture() { diff --git a/Core/TextureReplacer.h b/Core/TextureReplacer.h index 05d1488851..4fb5bf5224 100644 --- a/Core/TextureReplacer.h +++ b/Core/TextureReplacer.h @@ -201,8 +201,7 @@ struct ReplacedTexture { protected: void Prepare(); void PrepareData(int level); - // Returns size of data not purged. - size_t PurgeIfOlder(double t); + void PurgeIfOlder(double t); std::vector levels_; std::vector levelData_;