2012-04-18 68 views
0

我正在用Libgdx編寫一個小遊戲。渲染/更新線程同步

我有一個保持在所有對象上調用render()的aRender [OpenGL]線程和一個在所有對象上始終調用update(double delta)的更新線程。

更新線程循環方式更快。我應該嘗試使用某種同步,以便更新線程可以休息一下嗎? 會有什麼好處嗎?

更新

public void run() { 
    while(true){ 
     nano = System.nanoTime(); 
     long delta = nano - timestamp; 
     timestamp = nano; 
     accumulator+=(double)delta/BILION; 
     while(accumulator >= step){ 
      update(step); 
      accumulator-=step; 
     } 
     long loc = (long) ((step -accumulator)*1000)+1; 
     try { 
      Thread.sleep(loc); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
} 

我不知道它有問題,但我現在的更新是2500-20000 FPS。所以更新速度綽綽有餘。

回答

0

您的數據更新和您的渲染應該是獨立的,而不是​​。

您的更新功能應該以您確定的速度工作,這對用戶來說是最方便用戶的。

它應該獨立於渲染,因爲渲染速率可能會由於最終用戶使用的硬件而發生變化。 例如,您不希望您的「怪物」在上一代平板電腦上行走速度快十倍,因此無法播放。

您應該將您的更新率設置爲您選擇的常數。 然後,也許你會希望你的更新速度放慢一點,如果幀率真的很慢。

這是我的意見hoper它會幫助。

+0

「最易於用戶使用的更新速度」是什麼意思?我的更新運行速度儘可能高於最小步驟。更新炒鍋給定的三角洲,所以怪物的速度會是一樣的? – jellyfication 2012-04-18 14:41:25

1

不要使用單獨的線程更新邏輯,這是沒有理由的。

爲什麼你的更新方法每秒執行5000次,但渲染被限制在60?這是一個巨大的資源浪費。

你的渲染方法的第一行應該叫你的更新方法。

使用Gdx.graphics.getDeltaTime()來獲得時差。您可以在舊/遲鈍的手機上換取不平順但更慢的更新Math.max(1/30f, Gdx.graphics.getDeltaTime()。這將強制最低更新時間爲30fps。