diff options
author | TheKodeToad <TheKodeToad@proton.me> | 2023-07-01 13:05:55 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-07-01 13:05:55 +0100 |
commit | 7138425c8581e19d36ee62e1193a5b7184eb0089 (patch) | |
tree | d29efcad3353603c6ac1eb64708a92e616c00ecc /launcher/MTPixmapCache.h | |
parent | 05d2c1f0b06519eba9cc5ad22848106b49f9bd15 (diff) | |
parent | c523765c197cf63d6830d205f1554cd73e38109e (diff) | |
download | PrismLauncher-7138425c8581e19d36ee62e1193a5b7184eb0089.tar.gz PrismLauncher-7138425c8581e19d36ee62e1193a5b7184eb0089.tar.bz2 PrismLauncher-7138425c8581e19d36ee62e1193a5b7184eb0089.zip |
Merge branch 'develop' into better-component-installation
Signed-off-by: TheKodeToad <TheKodeToad@proton.me>
Diffstat (limited to 'launcher/MTPixmapCache.h')
-rw-r--r-- | launcher/MTPixmapCache.h | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/launcher/MTPixmapCache.h b/launcher/MTPixmapCache.h index 57847a0e..65cbe032 100644 --- a/launcher/MTPixmapCache.h +++ b/launcher/MTPixmapCache.h @@ -3,6 +3,8 @@ #include <QCoreApplication> #include <QPixmapCache> #include <QThread> +#include <QTime> +#include <QDebug> #define GET_TYPE() \ Qt::ConnectionType type; \ @@ -60,6 +62,8 @@ class PixmapCache final : public QObject { DEFINE_FUNC_ONE_PARAM(remove, bool, const QPixmapCache::Key&) DEFINE_FUNC_TWO_PARAM(replace, bool, const QPixmapCache::Key&, const QPixmap&) DEFINE_FUNC_ONE_PARAM(setCacheLimit, bool, int) + DEFINE_FUNC_NO_PARAM(markCacheMissByEviciton, bool) + DEFINE_FUNC_ONE_PARAM(setFastEvictionThreshold, bool, int) // NOTE: Every function returns something non-void to simplify the macros. private slots: @@ -90,6 +94,43 @@ class PixmapCache final : public QObject { return true; } + /** + * Mark that a cache miss occurred because of a eviction if too many of these occur too fast the cache size is increased + * @return if the cache size was increased + */ + bool _markCacheMissByEviciton() + { + auto now = QTime::currentTime(); + if (!m_last_cache_miss_by_eviciton.isNull()) { + auto diff = m_last_cache_miss_by_eviciton.msecsTo(now); + if (diff < 1000) { // less than a second ago + ++m_consecutive_fast_evicitons; + } else { + m_consecutive_fast_evicitons = 0; + } + } + m_last_cache_miss_by_eviciton = now; + if (m_consecutive_fast_evicitons >= m_consecutive_fast_evicitons_threshold) { + // double the cache size + auto newSize = _cacheLimit() * 2; + qDebug() << m_consecutive_fast_evicitons << "pixmap cache misses by eviction happened too fast, doubling cache size to" + << newSize; + _setCacheLimit(newSize); + m_consecutive_fast_evicitons = 0; + return true; + } + return false; + } + + bool _setFastEvictionThreshold(int threshold) + { + m_consecutive_fast_evicitons_threshold = threshold; + return true; + } + private: static PixmapCache* s_instance; + QTime m_last_cache_miss_by_eviciton; + int m_consecutive_fast_evicitons = 0; + int m_consecutive_fast_evicitons_threshold = 15; }; |