2015-10-06 18 views
0

所以我有一段舊的代碼,在實現Java遊戲跳轉時使用。爲什麼C++中的clock_gettime給了我與Java nanotime相比不同的值()

它看起來是這樣的:

//Vars 
final int Y_ZERO_POINT = 580; 
double height = 0, speed = 4; 
public static final double gravity = 9.81; 
double x = 25; 
int y = (int) (Y_ZERO_POINT-(height*100)); 
long previous, start = 0; 

// Code in my game loop 
     start = System.nanoTime(); 

     if(previous != 0 && up){ 
      double delta = start - previous; 
      height = (height + (delta/1000000000) * speed);   
      speed -= (delta/1000000000) * gravity; 
      y = (int) (Y_ZERO_POINT-(height * 100)); 

     } 
     previous = start; 

現在我想要實現在C++遊戲類似的東西。 在這裏閱讀:http://www.javacodegeeks.com/2012/02/what-is-behind-systemnanotime.html 我瞭解到Java System.getNanoTime()在Linux系統中使用clock_gettime(CLOCK_MONOTONIC, &ts);

所以我用它在我的C++代碼,並實現了相同的跳碼: https://github.com/Veske/CPP-Learning/blob/master/kodutoo3/player/player.cpp

而且差別是很大的。在Java中,跳轉總是一致的,並且像它應該結束一樣。在我的C++程序中,跳轉有時就像在Java中一樣,但大多數情況下它會發生根本性的變化。我從clock_gettime()得到的時間有時會跳很多,並且導致遊戲中的自我跳躍也顯得非常隨機。角色有時會跳出屏幕,然後再次正常跳轉。

是否有可能從C++時間函數獲得一致的結果,就像在Java中一樣,還是應該考慮對我的跳躍機制使用不同的方法?

+0

核心問題是,你只看着tv_nsec字段,這只是小數秒。您還需要將它與tv_sec字段結合使用。但推薦的解決方案是使用,如@ 865719所示 –

回答

2

如果您有C++ 11編譯器,則可以使用便攜式<chrono>標頭。

[run it online]

#include <iostream> 
#include <chrono> 
using namespace std; 

int main() 
{ 
    auto t0 = chrono::steady_clock::now(); 
    auto t1 = chrono::steady_clock::now(); 
    auto dt = t1 - t0; 

    cout << "t0: " << chrono::time_point_cast<chrono::nanoseconds>(t0).time_since_epoch().count() << " ns" << endl; 
    cout << "t1: " << chrono::time_point_cast<chrono::nanoseconds>(t1).time_since_epoch().count() << " ns" << endl; 
    cout << "dt: " << chrono::duration_cast<chrono::nanoseconds>(dt).count() << " ns" << endl; 

    return 0; 
} 

示例輸出:

t0: 2800906746162 ns 
t1: 2800906746345 ns 
dt: 183 ns 

對於時間差測量,確保使用一個不可調節(又名單調)時鐘等steady_clock。更多信息here

+0

工程就像一個魅力!謝謝! – Kaspar

相關問題