18#include "activeframepool.h"
22ActiveFramePool::ActiveFramePool()
24 Q_ASSERT(mMemoryBudgetInBytes >= (1024 * 1024 * 100));
27ActiveFramePool::~ActiveFramePool()
32void ActiveFramePool::put(
KeyFrame* key)
37 Q_ASSERT(key->pos() > 0);
41 auto it = mCacheFramesMap.find(key);
42 const bool keyExistsInPool = (it != mCacheFramesMap.end());
46 mCacheFramesList.erase(it->second);
48 mCacheFramesList.push_front(key);
49 mCacheFramesMap[key] = mCacheFramesList.begin();
51 key->addEventListener(
this);
55 mTotalUsedMemory += key->memoryUsage();
58 discardLeastUsedFrames();
61void ActiveFramePool::clear()
63 for (
KeyFrame* key : mCacheFramesList)
65 key->removeEventListner(
this);
67 mCacheFramesList.clear();
68 mCacheFramesMap.clear();
71void ActiveFramePool::resize(quint64 memoryBudget)
73 memoryBudget = qMin(memoryBudget, quint64(1024) * 1024 * 1024 * 16);
74 memoryBudget = qMax(memoryBudget, quint64(1024) * 1024 * 100);
75 mMemoryBudgetInBytes = memoryBudget;
76 discardLeastUsedFrames();
79bool ActiveFramePool::isFrameInPool(
KeyFrame* key)
81 auto it = mCacheFramesMap.find(key);
82 return (it != mCacheFramesMap.end());
85void ActiveFramePool::setMinFrameCount(
size_t frameCount)
87 mMinFrameCount = frameCount;
90void ActiveFramePool::onKeyFrameDestroy(
KeyFrame* key)
92 auto it = mCacheFramesMap.find(key);
93 if (it != mCacheFramesMap.end())
95 mCacheFramesList.erase(it->second);
96 mCacheFramesMap.erase(it);
100 recalcuateTotalUsedMemory();
104void ActiveFramePool::discardLeastUsedFrames()
106 while ((mTotalUsedMemory > mMemoryBudgetInBytes) && (mCacheFramesList.size() > mMinFrameCount))
108 list_iterator_t last = mCacheFramesList.end();
112 unloadFrame(lastKeyFrame);
114 mCacheFramesMap.erase(lastKeyFrame);
115 mCacheFramesList.pop_back();
117 lastKeyFrame->removeEventListner(
this);
121void ActiveFramePool::unloadFrame(
KeyFrame* key)
123 mTotalUsedMemory -= key->memoryUsage();
127void ActiveFramePool::recalcuateTotalUsedMemory()
129 mTotalUsedMemory = 0;
130 for (
KeyFrame* key : mCacheFramesList)
132 mTotalUsedMemory += key->memoryUsage();