Как лучше сделать обновление окна и программы на SFML/C++?
Я, пытаясь ограничить скорость обновления программы (графического и скриптового), столкнулся с несколькими проблемами, и я не думаю что я их решил корректно. Сейчас я использую вот такой код: main.cpp:
sf::Event evnMain;
sf::Clock clockMain;
unsigned short usRefreshRate = 60;
unsigned short usCurrentFrame = 0;
unsigned int nCurrentTick = 0;
float fTime = (float)(1000 / usRefreshRate);
int main() {
sf::RenderWindow wndMain(sf::VideoMode(nScreenWidth, nScreenHeight), strGameName);
while (wndMain.isOpen() && !bExitGame) {
while (fTime >= (1000 / usRefreshRate)) {
clockMain.restart();
while (wndMain.pollEvent(evnMain)) {
if (evnMain.type == sf::Event::Closed || bExitGame) {
wndMain.close();
}
}
usCurrentFrame++;
if (usCurrentFrame / (usRefreshRate / 60) % (usRefreshRate / 60) == 0) {
nCurrentTick++;
gameUpdate(wndMain, nCurrentTick);
}
while (fTime < (1000 / usRefreshRate)) {
fTime = clockMain.getElapsedTime().asMilliseconds();
}
}
}
}
В функцию gameUpdate передаются тики (60/сек), где они уже используются для отображения анимаций и прочего, при этом закрывать частоту графического обновления на 60 кадров/с я не хочу для пользователей мониторов с частотами обновления больше 60гц, так что окно обновляться будет 1000 / частотаОбновления.
Я уверен, что данный код неправильно выполняет задачи, которые я описал. Иногда обновления происходят быстрее или медленнее установленного (в данном случае 60/сек). Какие методы стоит использовать для стабильной обработки скорости (кроме setVerticalSyncEnabled из SFML)?