Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML 2.0] Dziwne wyniki sf::Clock

Ostatnio zmodyfikowano 2014-03-11 11:38
Autor Wiadomość
RazzorFlame
Temat założony przez niniejszego użytkownika
[SFML 2.0] Dziwne wyniki sf::Clock
» 2014-03-10 17:31:54
Bez zbędnego gadania. Mam sobie sf::Clock. 450-540 (tyle FPS) na sekunde otrzymuje wynik że minęło 1-5 sekund. Daje to ok. 450-2200 sekund na prawdziwą sekunde. Pytam się co to ma znaczyć. Otrzymuje niewiarygodne wyniki z sf::Time::asMicroseconds (ok. 60x mniejsze niż powinno), sf::Time::asMilliseconds <- to już nawet nie chce komentować bo czasem dostaje 0, czasem 10-10000tys.
Prosze oto kod:
timer.hpp
C/C++
#ifndef TIMER_HPP_INCLUDED
#define TIMER_HPP_INCLUDED

#include "main.hpp"

class Timer
{
    static double * getSpeed();
   
    sf::Clock m_Clock;
   
    double m_Time;
   
    char m_Status;
   
    static double * m_GameSpeed;
   
public:
   
    Timer();
   
    static void setSpeed( double * );
   
    double getTime();
    char getStatus();
    void setStatus( char );
   
    double restart();
   
    void update( const double = * Timer::getSpeed() );
   
    enum
    {
        Timing = 0,
        Paused = 1
    };
};


#endif // TIMER_HPP_INCLUDED
timer.cpp
C/C++
#include "timer.hpp"
double * Timer::m_GameSpeed = NULL;
Timer::Timer()
{
    m_Status = Timing;
}

double Timer::getTime()
{
    update();
    return m_Time;
}
char Timer::getStatus()
{
    return m_Status;
}
void Timer::setStatus( char status )
{
    m_Status = status;
}

double * Timer::getSpeed()
{
    return m_GameSpeed;
}
void Timer::setSpeed( double * speed )
{
    m_GameSpeed = speed;
}

double Timer::restart()
{
    m_Clock.restart();
   
    double myTime = m_Time;
    m_Time = 0;
    return myTime;
}

void Timer::update( const double speed )
{
    if( m_Status != Timing )
    {
        m_Clock.restart();
        return;
    }
    sf::Time tim = m_Clock.getElapsedTime();
    cout << "Elapsed (seconds): " << tim.asSeconds() << endl;
    cout << "Elapsed (milliseconds): " << tim.asMilliseconds() << endl;
    cout << "Elapsed (microseconds): " << tim.asMicroseconds() << endl;
    m_Time += tim.asSeconds() * speed;
   
    m_Clock.restart();
}
wywołanie (w main.cpp):
C/C++
while( m_RW.isOpen() )
{
    sf::Event ev;
    while( m_RW.pollEvent( ev ) )
    {
        if( ev.type == sf::Event::Closed ) m_RW.close();
       
    }
   
    m_GameTimer.getTime();
    m_RW.clear();
   
    m_Map.draw( & m_RW );
   
    m_RW.display();
    m_GameTimer.restart();
    loops++;
   
    if( fps.getElapsedTime().asSeconds() >= 1 )
    {
        cout << "FPS: " << loops << endl;
        loops = 0;
        fps.restart();
    }
}
A o to log konsoli:

Elapsed (microseconds): 37
Elapsed (seconds): 3.3e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 33
Elapsed (seconds): 5.2e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 52
Elapsed (seconds): 4.1e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 41
Elapsed (seconds): 3.7e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 37
Elapsed (seconds): 3.4e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 34
Elapsed (seconds): 3.9e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 39
Elapsed (seconds): 9.3e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 93
Elapsed (seconds): 3.5e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 35
Elapsed (seconds): 4e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 40
Elapsed (seconds): 3.2e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 32
Elapsed (seconds): 3.9e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 39
Elapsed (seconds): 3.9e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 39
Elapsed (seconds): 3.9e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 39
Elapsed (seconds): 3.7e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 37
Elapsed (seconds): 4e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 40
Elapsed (seconds): 3.9e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 39
Elapsed (seconds): 4.2e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 42
Elapsed (seconds): 4.1e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 41
Elapsed (seconds): 4.1e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 41
Elapsed (seconds): 3.2e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 32
Elapsed (seconds): 5.2e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 52
Elapsed (seconds): 3.3e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 33
Elapsed (seconds): 3.3e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 33
Elapsed (seconds): 4.4e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 44
Elapsed (seconds): 3.4e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 34
Elapsed (seconds): 3.8e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 38
Elapsed (seconds): 4e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 40
Elapsed (seconds): 4e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 40
Elapsed (seconds): 3.5e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 35
Elapsed (seconds): 4.2e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 42
Elapsed (seconds): 5.5e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 55
Elapsed (seconds): 3.3e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 33
Elapsed (seconds): 3.4e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 34
Elapsed (seconds): 3.4e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 34
Elapsed (seconds): 3.8e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 38
Elapsed (seconds): 3.8e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 38
Elapsed (seconds): 4.1e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 41
Elapsed (seconds): 3.7e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 37
Elapsed (seconds): 4e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 40
Elapsed (seconds): 3.7e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 37
Elapsed (seconds): 4.2e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 42
Elapsed (seconds): 4.9e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 49
Elapsed (seconds): 5e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 50
Elapsed (seconds): 3.3e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 33
Elapsed (seconds): 4e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 40
Elapsed (seconds): 3.5e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 35
Elapsed (seconds): 3.4e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 34
Elapsed (seconds): 3.8e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 38
Elapsed (seconds): 3.4e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 34
Elapsed (seconds): 4.9e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 49
Elapsed (seconds): 3.7e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 37
Elapsed (seconds): 3.4e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 34
Elapsed (seconds): 4e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 40
Elapsed (seconds): 4e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 40
Elapsed (seconds): 3.3e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 33
Elapsed (seconds): 4e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 40
Elapsed (seconds): 3.6e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 36
Elapsed (seconds): 4.1e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 41
Elapsed (seconds): 4.2e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 42
Elapsed (seconds): 3.4e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 34
Elapsed (seconds): 3.9e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 39
Elapsed (seconds): 3.8e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 38
Elapsed (seconds): 4.1e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 41
Elapsed (seconds): 3.5e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 35
Elapsed (seconds): 3.9e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 39
Elapsed (seconds): 4.2e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 42
Elapsed (seconds): 3.4e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 34
Elapsed (seconds): 3.3e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 33
Elapsed (seconds): 4e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 40
Elapsed (seconds): 4.5e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 45
Elapsed (seconds): 5.1e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 51
Elapsed (seconds): 3.7e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 37
Elapsed (seconds): 3.8e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 38
Elapsed (seconds): 4e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 40
Elapsed (seconds): 3.9e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 39
Elapsed (seconds): 3.5e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 35
Elapsed (seconds): 3.7e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 37
Elapsed (seconds): 0.00018
Elapsed (milliseconds): 0
Elapsed (microseconds): 180
Elapsed (seconds): 4e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 40
Elapsed (seconds): 3.5e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 35
Elapsed (seconds): 3.5e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 35
Elapsed (seconds): 3.9e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 39
Elapsed (seconds): 4e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 40
Elapsed (seconds): 4e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 40
Elapsed (seconds): 3.4e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 34
Elapsed (seconds): 3.3e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 33
Elapsed (seconds): 3.9e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 39
Elapsed (seconds): 5.2e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 52
Elapsed (seconds): 5.1e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 51
Elapsed (seconds): 3.2e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 32
Elapsed (seconds): 3.8e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 38
Elapsed (seconds): 4.4e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 44
Elapsed (seconds): 3.4e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 34
Elapsed (seconds): 4e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 40
Elapsed (seconds): 3.5e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 35
Elapsed (seconds): 3.4e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 34
Elapsed (seconds): 4.5e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 45
Elapsed (seconds): 4.1e-005
Elapsed (milliseconds): 0
Elapsed (microseconds): 41
FPS: 328
Elapsed (seconds): 0.000443
Elapsed (milliseconds): 0
Elapsed (microseconds): 443
Masakra, co to ma być?
sf::Clock fps działa poprawnie.
P-106014
DejaVu
» 2014-03-10 17:36:23
sf::Clock działa poprawnie - co najwyżej Ty masz błędy w swoim kodzie lub w obliczeniach.
P-106015
RazzorFlame
Temat założony przez niniejszego użytkownika
» 2014-03-10 17:37:34
No dobra, ale wskaż co jest źle bo wyświetlam wyniki bezpośrednio z m_Clock bez żadnych dodatkowych obliczeń. Kod jest aktualny, nie był zmieniany.
P-106016
DejaVu
» 2014-03-10 17:38:49
C/C++
m_Time += tim.asSeconds() * speed;

PS. Z Twojego opisu kompletnie nie wiadomo o co Ci chodzi.
P-106017
RazzorFlame
Temat założony przez niniejszego użytkownika
» 2014-03-10 17:43:03
Tak, tylko zobacz na log. Wyraźnie widać że coś jest nie tak. A tak poza tym, to te obliczenie jest jak najbardziej poprawne - wielokrotnie sprawdzałem zmienną speed - wynosi 1.0 tak jak wcześniej zdefiniowałem ją w innym pliku. Mój timer działa na takiej zasadzie żeby jak najczęściej go aktualizować:
Gra działa na speedzie 1.0:
Mija pare sekund, timer = (załóżmy) 11 (sekund).
Teraz występuje cutscenka z prędkością 0.2
Timer nadal aktualizuje się co chwilkę więc dostaje poprawne dane o miniętym czasie gry, nie o czasie rzeczywistym.

Już wyjaśniam. Mam sobie timer - chce by liczył czas gry (ze względem na aktualną prędkość gry). Zwykły sf::Clock liczy prawdziwy czas. Po prostu jak najczęściej go aktualizuje by dane były jak najbardziej precyzyjne. Log pokazuje że ponad 400x na sekunde (tą prawdziwą) dostaje wynik od sf::Clock że minęło ok. 1-5 sekund. Tak jakbyś przyspieszył czas jakieś 1500x ;)

Edit:
Co ciekawe ostatnie trzy pomiary są w miare dokładne (nie licząc milisekund bo wynoszą nadal 0...)
P-106018
DejaVu
» 2014-03-10 18:03:51
Jak możesz dostawać czas ok 1-5 sekund?? Podaj konkretne wartości dla konkretnego czasu, bo z takim rozrzutem to niczego nie da się policzyć.
P-106023
RazzorFlame
Temat założony przez niniejszego użytkownika
» 2014-03-10 20:23:54
Widać wszystko w logu. Poza tym kiedy jest coś w tym dziwnego bo jeżeli chcę poruszać jakimś spritem z prędkością 250*timer.getTime() czyli 250px na sekunde, to  porusza się on bardzo wolno. Zaobserwowałem też, że kiedy dodam do funkcji update z klasy Timer jakiegoś couta zaraz przed dodaniem do m_Time czasu to sprite posuwa się troszkę szybciej (nie mam pojęcia dlaczego, ale widziałem to na własne oczy!). Albo mi komputer się psuje albo jakieś cuda tu występują...
P-106049
DejaVu
» 2014-03-10 21:11:48
Twój kod jest zły. Powinieneś co najwyżej zapisywać czas ostatniej klatki, zegara nie restartować i przed każdym kolejnym pomiarem liczyć:
C/C++
nowyCzas = clock.asSeconds();
float deltaT = nowyCzas - ostatni_czas;
ostatni_czas = nowyCzas;
P-106060
« 1 » 2
  Strona 1 z 2 Następna strona