Любая причина, по которой Chrono Time будет ускоряться, кроме моего кода? - PullRequest
0 голосов
/ 13 марта 2020

через пару секунд в моей игре все ускоряется. Я не могу найти никаких проблем с моим кодом, но определенно может быть. Мне было интересно, если это возможно, что моя видеокарта пинает в разгар или что-то в этом роде. Спасибо за любые советы, спасибо!

#include <SFML/Graphics.hpp>
#include <iostream>
#include <chrono>
#include <ctime>    
#include "PongGame.h"

int main()
{

    PongGame game(10);
    sf::RenderWindow window(sf::VideoMode(1500, 900), "SFML works!");

    float UPDATE_INTERVAL = 900000000.0f;
    float lag = 0.0f;

    typedef std::chrono::high_resolution_clock Time;
    typedef std::chrono::milliseconds ms;
    typedef std::chrono::duration<float> fsec;
    auto prevTime = Time::now();

    while (window.isOpen())
    {
        auto currTime = Time::now();
        fsec fs = currTime - prevTime;
        ms d = std::chrono::duration_cast<ms>(fs);
        lag += d.count();
        //std::cout << "lag1: " << lag << "\n";
        while (lag > UPDATE_INTERVAL) {
            std::cout << "loop";
            sf::Event currEvent;
            while (window.pollEvent(currEvent))
            {
                if (currEvent.type == sf::Event::Closed) { window.close(); }
            }
            game.PollKeys();
            game.Update(1.0f);
            game.Render(1.0f, &window);
            //lag -= UPDATE_INTERVAL;
            lag = 0;
            std::cout << "lag2: " << lag << "\n";
        }
    }

    return 0;
}

@ Говард Хиннант

Сейчас я сравниваю все в хронологических миллисекундах. Я прошел через код достаточно много, и я просто не могу понять, почему он так ускоряется. Вот новый код:

#include <SFML/Graphics.hpp>
#include <iostream>
#include <chrono>
#include <ctime>    
#include "PongGame.h"

int main()
{
    typedef std::chrono::high_resolution_clock hiResTime;
    typedef std::chrono::milliseconds ms;
    typedef std::chrono::high_resolution_clock::time_point time_point;

    PongGame game(10);
    sf::RenderWindow window(sf::VideoMode(1500, 900), "SFML works!");
    time_point prevTime = hiResTime::now();
    time_point currTime = hiResTime::now();
    const ms UPDATE_INTERVAL(99999999);
    ms lag(0);

    while (window.isOpen())
    {
        prevTime = currTime;
        time_point currTime = hiResTime::now();
        ms currInterval = std::chrono::duration_cast<std::chrono::milliseconds>(currTime - prevTime);
        lag += currInterval;
        if (lag > UPDATE_INTERVAL) {
            //std::cout << "loop";
            sf::Event currEvent;

            if ((window.pollEvent(currEvent)) && (currEvent.type == sf::Event::Closed)) { window.close(); }
            game.PollKeys();
            game.Update(1.0f);
            game.Render(1.0f, &window);

            //lag -= UPDATE_INTERVAL;
            lag = ms(0);
        }
    }
    return 0;
}

1 Ответ

2 голосов
/ 14 марта 2020

В старой версии вашего кода вы забыли обновить prevTime. В текущей версии вы по-прежнему этого не делаете, поскольку currTime в prevTime = currTime; - это то, что определено непосредственно в main(), но оно никогда не обновляется, поскольку time_point currTime = hiResTime::now(); определяет новую переменную с тем же именем (что разрешено потому что это во вложенном блоке) вместо обновления ранее определенного. Поэтому первый currTime всегда содержит время начала игры.

...