追蹤
兔子也會的遊戲設計
關於部落格
一個推廣XNA與OGRE的園地,當然還有其他關於遊戲設計的主題,歡迎有興趣的同好交流指教
  • 104824

    累積人氣

  • 0

    今日人氣

    0

    追蹤人氣

XNA中的時間更新機制

在這篇文章中曾經提過計算fps的方法,在XNA 1.0的時候,更新機制是這樣的:

  • 呼叫 Update多次 直到趕上目前的時間。
  • 重復呼叫 Draw 多次 直到下一次的更新。

    現在2.0不一樣了,變成

  • 呼叫 Update多次 直到趕上目前的時間。
  • 呼叫 Draw 一次
  • 等待直到下次的更新 

    也就是說兩次Update的中間只會呼叫一次Draw,舉例以前1.0的行為:

  • 假設固定60 fps、開啟垂直同步、螢幕更新率是75hz 
  • 當執行完Update花了 3 milliseconds
  • 當執行完Draw花了 5 milliseconds
  • 總共花了 8 milliseconds  
  • 60 fps 更新一次要花 16.7 milliseconds,所以還沒到下次更新的時間 
  • 重複呼叫Draw 
  • 因為垂直同步開啟,顯示卡為了與75hz的螢幕同步等待13 milliseconds
  • 總共花了21 milliseconds ,可能趕不上下次的更新。

     實際上影響是非常小的,因為Update會很快趕上目前的時間。但是在測量fps數時會
    有數據上的變異,在XNA 2.0我們可以更精準的使用Update來控制時間。

  • 當執行完Update花了 3 milliseconds 
  • 當執行完Draw花了 5 milliseconds 
  • 還有8.7 milliseconds的時間等待
  • 每次更新都如此重複
    .
    主要的差別就是XNA1.0的時候我們鎖張數也能測量fps數,只要計算Draw了幾次(前面說過會一直呼叫
    Draw),XNA 2.0不行,他只會回傳固定的60張。但實際上在鎖張數的情況下算fps是沒有意義的,
    算fps本來就應該讓他跑到極限,所以之前1.0使用的算fps方法是偷吃步,在2.0不能這樣用。
    那該怎麼用呢?老實點把垂直同步關掉以及不鎖張數。可以寫個define僅在測試效能時設定。
    #if PROFILE
              this.IsFixedTimeStep=false;
              graphics.SynchronizeWithVerticalRetrace = false;
    #endif

    如此就能較為精確的測量fps數值。






  • 相簿設定
    標籤設定
    相簿狀態