Как лучше сделать обновление окна и программы на 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)?


Ответы (0 шт):