diff --git a/src/ResourceDisplay/ImageResourceDisplay.cpp b/src/ResourceDisplay/ImageResourceDisplay.cpp index 8c84693..fdeac95 100644 --- a/src/ResourceDisplay/ImageResourceDisplay.cpp +++ b/src/ResourceDisplay/ImageResourceDisplay.cpp @@ -1,4 +1,5 @@ #include "ImageResourceDisplay.hpp" +#include #include #include #include @@ -57,6 +58,13 @@ bool ImageResourceDisplay::update_draw() const { } void ImageResourceDisplay::update(World& w) { + for(auto& frame : frames) { + std::erase_if(frame.mipmapLevels, [](const auto& mipmapPair) { + static constexpr std::chrono::duration TIME_TO_REMOVE_MIPMAP_CACHE = std::chrono::seconds(40); + return std::chrono::steady_clock::now() - mipmapPair.second.timeLastUsed > TIME_TO_REMOVE_MIPMAP_CACHE; + }); + } + mustUpdateDraw = false; if(!loadedFirstFrame && loadedFrames >= 1) { mustUpdateDraw = true; @@ -131,11 +139,13 @@ void ImageResourceDisplay::draw(SkCanvas* canvas, const DrawData& drawData, cons SkImageInfo mipmapImgInfo = imageInfo.makeDimensions(mipmapResolution); sk_sp mipmapImage = frame.data->makeScaled(mipmapImgInfo, SkSamplingOptions(SkFilterMode::kLinear, SkMipmapMode::kNone)); - frame.mipmapLevels.emplace(mipmapLevel, mipmapImage); + frame.mipmapLevels.emplace(mipmapLevel, MipmapLevelData{mipmapImage, std::chrono::steady_clock::now()}); canvas->drawImageRect(mipmapImage, imRect, {SkFilterMode::kLinear, SkMipmapMode::kNone}); } - else - canvas->drawImageRect(mipmapIt->second, imRect, {SkFilterMode::kLinear, SkMipmapMode::kNone}); + else { + mipmapIt->second.timeLastUsed = std::chrono::steady_clock::now(); + canvas->drawImageRect(mipmapIt->second.imageData, imRect, {SkFilterMode::kLinear, SkMipmapMode::kNone}); + } } } } diff --git a/src/ResourceDisplay/ImageResourceDisplay.hpp b/src/ResourceDisplay/ImageResourceDisplay.hpp index 00765cf..a8621be 100644 --- a/src/ResourceDisplay/ImageResourceDisplay.hpp +++ b/src/ResourceDisplay/ImageResourceDisplay.hpp @@ -16,10 +16,14 @@ class ImageResourceDisplay : public ResourceDisplay { virtual Type get_type() const override; virtual ~ImageResourceDisplay() override; private: + struct MipmapLevelData { + sk_sp imageData; + std::chrono::steady_clock::time_point timeLastUsed; + }; struct FrameData { sk_sp data; float duration; - std::unordered_map> mipmapLevels; + std::unordered_map mipmapLevels; }; std::vector frames;