mirror of
https://github.com/vcmi/vcmi.git
synced 2025-07-15 01:24:45 +02:00
Merge pull request #2952 from Alexander-Wilms/develop
Enable VSync to prevent screen tearing while scrolling across map
This commit is contained in:
@ -129,11 +129,10 @@ void CGuiHandler::renderFrame()
|
|||||||
|
|
||||||
CCS->curh->render();
|
CCS->curh->render();
|
||||||
|
|
||||||
SDL_RenderPresent(mainRenderer);
|
|
||||||
|
|
||||||
windows().onFrameRendered();
|
windows().onFrameRendered();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SDL_RenderPresent(mainRenderer);
|
||||||
framerate().framerateDelay(); // holds a constant FPS
|
framerate().framerateDelay(); // holds a constant FPS
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,11 +11,15 @@
|
|||||||
#include "StdInc.h"
|
#include "StdInc.h"
|
||||||
#include "FramerateManager.h"
|
#include "FramerateManager.h"
|
||||||
|
|
||||||
|
#include "../../lib/CConfigHandler.h"
|
||||||
|
#include <SDL_video.h>
|
||||||
|
|
||||||
FramerateManager::FramerateManager(int targetFrameRate)
|
FramerateManager::FramerateManager(int targetFrameRate)
|
||||||
: targetFrameTime(Duration(boost::chrono::seconds(1)) / targetFrameRate)
|
: targetFrameTime(Duration(boost::chrono::seconds(1)) / targetFrameRate)
|
||||||
, lastFrameIndex(0)
|
, lastFrameIndex(0)
|
||||||
, lastFrameTimes({})
|
, lastFrameTimes({})
|
||||||
, lastTimePoint (Clock::now())
|
, lastTimePoint(Clock::now())
|
||||||
|
, vsyncEnabled(settings["video"]["vsync"].Bool())
|
||||||
{
|
{
|
||||||
boost::range::fill(lastFrameTimes, targetFrameTime);
|
boost::range::fill(lastFrameTimes, targetFrameTime);
|
||||||
}
|
}
|
||||||
@ -24,9 +28,14 @@ void FramerateManager::framerateDelay()
|
|||||||
{
|
{
|
||||||
Duration timeSpentBusy = Clock::now() - lastTimePoint;
|
Duration timeSpentBusy = Clock::now() - lastTimePoint;
|
||||||
|
|
||||||
// FPS is higher than it should be, then wait some time
|
if(!vsyncEnabled)
|
||||||
if(timeSpentBusy < targetFrameTime)
|
{
|
||||||
boost::this_thread::sleep_for(targetFrameTime - timeSpentBusy);
|
// if FPS is higher than it should be, then wait some time
|
||||||
|
if(timeSpentBusy < targetFrameTime)
|
||||||
|
{
|
||||||
|
boost::this_thread::sleep_for(targetFrameTime - timeSpentBusy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// compute actual timeElapsed taking into account actual sleep interval
|
// compute actual timeElapsed taking into account actual sleep interval
|
||||||
// limit it to 100 ms to avoid breaking animation in case of huge lag (e.g. triggered breakpoint)
|
// limit it to 100 ms to avoid breaking animation in case of huge lag (e.g. triggered breakpoint)
|
||||||
|
@ -25,6 +25,8 @@ class FramerateManager
|
|||||||
/// index of last measured frome in lastFrameTimes array
|
/// index of last measured frome in lastFrameTimes array
|
||||||
ui32 lastFrameIndex;
|
ui32 lastFrameIndex;
|
||||||
|
|
||||||
|
bool vsyncEnabled;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
FramerateManager(int targetFramerate);
|
FramerateManager(int targetFramerate);
|
||||||
|
|
||||||
|
@ -274,8 +274,14 @@ void ScreenHandler::initializeWindow()
|
|||||||
handleFatalError(message, true);
|
handleFatalError(message, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
//create first available renderer if preferred not set. Use no flags, so HW accelerated will be preferred but SW renderer also will possible
|
// create first available renderer if no preferred one is set
|
||||||
mainRenderer = SDL_CreateRenderer(mainWindow, getPreferredRenderingDriver(), 0);
|
// use no SDL_RENDERER_SOFTWARE or SDL_RENDERER_ACCELERATED flag, so HW accelerated will be preferred but SW renderer will also be possible
|
||||||
|
uint32_t rendererFlags = 0;
|
||||||
|
if(settings["video"]["vsync"].Bool())
|
||||||
|
{
|
||||||
|
rendererFlags |= SDL_RENDERER_PRESENTVSYNC;
|
||||||
|
}
|
||||||
|
mainRenderer = SDL_CreateRenderer(mainWindow, getPreferredRenderingDriver(), rendererFlags);
|
||||||
|
|
||||||
if(mainRenderer == nullptr)
|
if(mainRenderer == nullptr)
|
||||||
throw std::runtime_error("Unable to create renderer\n");
|
throw std::runtime_error("Unable to create renderer\n");
|
||||||
|
@ -149,7 +149,8 @@
|
|||||||
"driver",
|
"driver",
|
||||||
"displayIndex",
|
"displayIndex",
|
||||||
"showfps",
|
"showfps",
|
||||||
"targetfps"
|
"targetfps",
|
||||||
|
"vsync"
|
||||||
],
|
],
|
||||||
"properties" : {
|
"properties" : {
|
||||||
"resolution" : {
|
"resolution" : {
|
||||||
@ -207,6 +208,10 @@
|
|||||||
"targetfps" : {
|
"targetfps" : {
|
||||||
"type" : "number",
|
"type" : "number",
|
||||||
"default" : 60
|
"default" : 60
|
||||||
|
},
|
||||||
|
"vsync" : {
|
||||||
|
"type" : "boolean",
|
||||||
|
"default" : true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -83,6 +83,8 @@ void CSettingsView::loadSettings()
|
|||||||
|
|
||||||
ui->spinBoxInterfaceScaling->setValue(settings["video"]["resolution"]["scaling"].Float());
|
ui->spinBoxInterfaceScaling->setValue(settings["video"]["resolution"]["scaling"].Float());
|
||||||
ui->spinBoxFramerateLimit->setValue(settings["video"]["targetfps"].Float());
|
ui->spinBoxFramerateLimit->setValue(settings["video"]["targetfps"].Float());
|
||||||
|
ui->spinBoxFramerateLimit->setDisabled(settings["video"]["vsync"].Bool());
|
||||||
|
ui->checkBoxVSync->setChecked(settings["video"]["vsync"].Bool());
|
||||||
ui->spinBoxReservedArea->setValue(std::round(settings["video"]["reservedWidth"].Float() * 100));
|
ui->spinBoxReservedArea->setValue(std::round(settings["video"]["reservedWidth"].Float() * 100));
|
||||||
|
|
||||||
ui->comboBoxFriendlyAI->setCurrentText(QString::fromStdString(settings["server"]["friendlyAI"].String()));
|
ui->comboBoxFriendlyAI->setCurrentText(QString::fromStdString(settings["server"]["friendlyAI"].String()));
|
||||||
@ -494,6 +496,13 @@ void CSettingsView::on_spinBoxFramerateLimit_valueChanged(int arg1)
|
|||||||
node->Float() = arg1;
|
node->Float() = arg1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CSettingsView::on_checkBoxVSync_stateChanged(int arg1)
|
||||||
|
{
|
||||||
|
Settings node = settings.write["video"]["vsync"];
|
||||||
|
node->Bool() = arg1;
|
||||||
|
ui->spinBoxFramerateLimit->setDisabled(settings["video"]["vsync"].Bool());
|
||||||
|
}
|
||||||
|
|
||||||
void CSettingsView::on_comboBoxEnemyPlayerAI_currentTextChanged(const QString &arg1)
|
void CSettingsView::on_comboBoxEnemyPlayerAI_currentTextChanged(const QString &arg1)
|
||||||
{
|
{
|
||||||
Settings node = settings.write["server"]["playerAI"];
|
Settings node = settings.write["server"]["playerAI"];
|
||||||
|
@ -62,6 +62,8 @@ private slots:
|
|||||||
|
|
||||||
void on_spinBoxFramerateLimit_valueChanged(int arg1);
|
void on_spinBoxFramerateLimit_valueChanged(int arg1);
|
||||||
|
|
||||||
|
void on_checkBoxVSync_stateChanged(int arg1);
|
||||||
|
|
||||||
void on_comboBoxEnemyPlayerAI_currentTextChanged(const QString &arg1);
|
void on_comboBoxEnemyPlayerAI_currentTextChanged(const QString &arg1);
|
||||||
|
|
||||||
void on_comboBoxAlliedPlayerAI_currentTextChanged(const QString &arg1);
|
void on_comboBoxAlliedPlayerAI_currentTextChanged(const QString &arg1);
|
||||||
|
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user