18 #include "activeframepool.h"
20 #include "pencildef.h"
23 ActiveFramePool::ActiveFramePool()
25 Q_ASSERT(mMemoryBudgetInBytes >= (1024 * 1024 * 100));
28 ActiveFramePool::~ActiveFramePool() {}
30 void ActiveFramePool::put(
KeyFrame* key)
35 Q_ASSERT(key->pos() > 0);
39 auto it = mCacheFramesMap.find(key);
40 const bool keyExistsInPool = (it != mCacheFramesMap.end());
44 mCacheFramesList.erase(it->second);
46 mCacheFramesList.push_front(key);
47 mCacheFramesMap[key] = mCacheFramesList.begin();
49 key->addEventListener(
this);
53 mTotalUsedMemory += key->memoryUsage();
56 discardLeastUsedFrames();
59 void ActiveFramePool::clear()
61 for (
KeyFrame* key : mCacheFramesList)
63 key->removeEventListner(
this);
65 mCacheFramesList.clear();
66 mCacheFramesMap.clear();
69 void ActiveFramePool::resize(quint64 memoryBudget)
71 memoryBudget = qMin(memoryBudget, quint64(1024) * 1024 * 1024 * 16);
72 memoryBudget = qMax(memoryBudget, quint64(1024) * 1024 * 100);
73 mMemoryBudgetInBytes = memoryBudget;
74 discardLeastUsedFrames();
77 bool ActiveFramePool::isFrameInPool(
KeyFrame* key)
79 auto it = mCacheFramesMap.find(key);
80 return (it != mCacheFramesMap.end());
83 void ActiveFramePool::onKeyFrameDestroy(
KeyFrame* key)
85 auto it = mCacheFramesMap.find(key);
86 if (it != mCacheFramesMap.end())
88 mCacheFramesList.erase(it->second);
89 mCacheFramesMap.erase(it);
93 recalcuateTotalUsedMemory();
97 void ActiveFramePool::discardLeastUsedFrames()
99 while (mTotalUsedMemory > mMemoryBudgetInBytes)
101 list_iterator_t last = mCacheFramesList.end();
105 unloadFrame(lastKeyFrame);
107 mCacheFramesMap.erase(lastKeyFrame);
108 mCacheFramesList.pop_back();
110 lastKeyFrame->removeEventListner(
this);
114 void ActiveFramePool::unloadFrame(
KeyFrame* key)
116 mTotalUsedMemory -= key->memoryUsage();
120 void ActiveFramePool::recalcuateTotalUsedMemory()
122 mTotalUsedMemory = 0;
123 for (
KeyFrame* key : mCacheFramesList)
125 mTotalUsedMemory += key->memoryUsage();