2014-01-19 35 views
0

這裏是一個noob的位。 我使用SFML在C++中製作了基本的Pong克隆遊戲,但是當我在其他計算機上運行.exe程序時(對於大多數其他PC)運行速度較慢。 我使用的Java之前用這樣的方式來調節每秒更新量:如何讓程序在不同的計算機上以相同的速度運行?

long lastTime = System.nanoTime(); 
    final double ns = 1000000000.0/60.0; 
    double delta = 0; 

    while(running) 
     { 
      long now = System.nanoTime(); 
      delta += (now - lastTime)/ns; 
      lastTime = now; 
      while(delta >= 1) 
       { 
        update(); 
        delta--; 
       } 
     render(); 
     }        
    } 

我打算用這個,但是C++有一個像Java的System.nanoTime()方法什麼? 還有什麼可以確保我的程序在不同的計算機上以相同的速度運行(或至少似乎以相同的速度運行)?

-Windows 7,VS2010。

+0

一些閱讀材料給你:[deWiTTERS Game Loop](http://www.koonsolo.com/news/dewitters-gameloop/)。還有一些:[''](http://en.cppreference.com/w/cpp/header/chrono)。 –

+0

[SFML有時間處理設施...](http://www.sfml-dev.org/tutorials/2.0/system-time.php) – Borgleader

+0

@JosephMansfield你是如何在一個評論中發佈兩個鏈接的? – Gasim

回答

1

對於Windows,您可以嘗試timeGetTimeQueryPerformanceCounter。前者消化起來要容易得多,儘管稍微不準確。

對於非Windows民謠,您可以使用clocktime。其他人也有很多。

+1

或...... SFML的時間公用事業或''更理智的方法...... – Rapptz

1

您可以使用C++ 11 <chrono>標題及其所有時間函數,或者您已經使用SFML,則可以直接使用它的函數。有window.setFramerateLimit(uint),它使用sleep()儘可能減少CPU使用率,但sleep()始終有一些不準確。然後有window.setVerticalSyncEnabeled(bool),它會(取消)激活VSync。這是您最想要去的方式,但請記住,VSync可能會被驅動程序強制關閉。

爲了保持跟蹤時間,您可以使用sf::Timesf::Clocksf::Time只是一個容器,它具有一定的時間間隔,可以很容易地轉換爲秒,毫秒和微秒。 sf::Clock只能重新啓動,它們不是停止監視(如果需要此功能,請參見here),但可以檢索到時間爲sf::Time的對象,因爲時鐘最後一次被重置。

不要忘了瀏覽SFML tutorialsdocumentation,它們包含關於SFML的任何想知道的內容。

Btw。納秒工作比任何事情都更加虛幻,它不是很準確,如果你的遊戲需要這麼小的分辨率,你的遊戲邏輯可能需要一些優化。

相關問題