diff --git a/libs/image/kis_image_config.h b/libs/image/kis_image_config.h --- a/libs/image/kis_image_config.h +++ b/libs/image/kis_image_config.h @@ -117,6 +117,9 @@ int frameRenderingClones(bool defaultValue = false) const; void setFrameRenderingClones(int value); + int fpsLimit(bool defaultValue = false) const; + void setFpsLimit(int value); + private: Q_DISABLE_COPY(KisImageConfig) diff --git a/libs/image/kis_image_config.cpp b/libs/image/kis_image_config.cpp --- a/libs/image/kis_image_config.cpp +++ b/libs/image/kis_image_config.cpp @@ -507,3 +507,13 @@ { m_config.writeEntry("frameRenderingClones", value); } + +int KisImageConfig::fpsLimit(bool defaultValue) const +{ + return defaultValue ? 100 : m_config.readEntry("fpsLimit", 100); +} + +void KisImageConfig::setFpsLimit(int value) +{ + m_config.writeEntry("fpsLimit", value); +} diff --git a/libs/ui/canvas/kis_canvas2.cpp b/libs/ui/canvas/kis_canvas2.cpp --- a/libs/ui/canvas/kis_canvas2.cpp +++ b/libs/ui/canvas/kis_canvas2.cpp @@ -178,7 +178,9 @@ m_d->bootstrapLodBlocked = true; connect(view->mainWindow(), SIGNAL(guiLoadingFinished()), SLOT(bootstrapFinished())); - m_d->updateSignalCompressor.setDelay(10); + KisImageConfig config; + + m_d->updateSignalCompressor.setDelay(1000 / config.fpsLimit()); m_d->updateSignalCompressor.setMode(KisSignalCompressor::FIRST_ACTIVE); } diff --git a/libs/ui/dialogs/kis_dlg_preferences.h b/libs/ui/dialogs/kis_dlg_preferences.h --- a/libs/ui/dialogs/kis_dlg_preferences.h +++ b/libs/ui/dialogs/kis_dlg_preferences.h @@ -229,14 +229,16 @@ void slotThreadsLimitChanged(int value); void slotFrameClonesLimitChanged(int value); + void slotFpsLimitChanged(int value); private: int realTilesRAM(); private: QVector m_syncs; int m_lastUsedThreadsLimit; int m_lastUsedClonesLimit; + int m_lastUsedFpsLimit; }; //======================= diff --git a/libs/ui/dialogs/kis_dlg_preferences.cc b/libs/ui/dialogs/kis_dlg_preferences.cc --- a/libs/ui/dialogs/kis_dlg_preferences.cc +++ b/libs/ui/dialogs/kis_dlg_preferences.cc @@ -699,9 +699,11 @@ sliderThreadsLimit->setRange(1, QThread::idealThreadCount()); sliderFrameClonesLimit->setRange(1, QThread::idealThreadCount()); + sliderFpsLimit->setRange(20, 100); connect(sliderThreadsLimit, SIGNAL(valueChanged(int)), SLOT(slotThreadsLimitChanged(int))); connect(sliderFrameClonesLimit, SIGNAL(valueChanged(int)), SLOT(slotFrameClonesLimitChanged(int))); + connect(sliderFpsLimit, SIGNAL(valueChanged(int)), SLOT(slotFpsLimitChanged(int))); load(false); } @@ -727,9 +729,11 @@ m_lastUsedThreadsLimit = cfg.maxNumberOfThreads(requestDefault); m_lastUsedClonesLimit = cfg.frameRenderingClones(requestDefault); + m_lastUsedFpsLimit = cfg.fpsLimit(requestDefault); sliderThreadsLimit->setValue(m_lastUsedThreadsLimit); sliderFrameClonesLimit->setValue(m_lastUsedClonesLimit); + sliderFpsLimit->setValue(m_lastUsedFpsLimit); { KisConfig cfg2; @@ -755,6 +759,7 @@ cfg.setMaxNumberOfThreads(sliderThreadsLimit->value()); cfg.setFrameRenderingClones(sliderFrameClonesLimit->value()); + cfg.setFpsLimit(sliderFpsLimit->value()); { KisConfig cfg2; @@ -788,6 +793,13 @@ m_lastUsedClonesLimit = value; } +void PerformanceTab::slotFpsLimitChanged(int value) +{ + KisSignalsBlocker b(sliderFrameClonesLimit); + sliderFrameClonesLimit->setValue(qMax(m_lastUsedFpsLimit, value)); + m_lastUsedFpsLimit = value; +} + //--------------------------------------------------------------------------------------------------- #include "KoColor.h" diff --git a/libs/ui/forms/wdgperformancesettings.ui b/libs/ui/forms/wdgperformancesettings.ui --- a/libs/ui/forms/wdgperformancesettings.ui +++ b/libs/ui/forms/wdgperformancesettings.ui @@ -271,6 +271,30 @@ Advanced (needs restarting Krita) + + + + + + Limit Frames per Second: + + + + + + + + 0 + 0 + + + + <html><head/><body><p>Krita will try to limit the number of screen updates per second to the given number. A lower number will decrease visual responsiveness but increase stylus precision on some systems like macOS.<p></body></html> + + + + +