2011-05-24 33 views
0

我是線程100%新手,作爲一個開始,我已決定使用它來更新單獨線程中的物理。我使用的是被稱爲先知第三方物理引擎,這裏是我在做什麼:在單獨的線程中更新物理引擎,這是明智的嗎?

// class level declarations 
System.Threading.Thread thread; 
Stopwatch threadUpdate = new Stopwatch(); 

//In the constructor: 
PhysicsEngine() 
{ 
(...) 

      thread = new System.Threading.Thread(
         new System.Threading.ThreadStart(PhysicsThread)); 
      threadUpdate.Start(); 

      thread.Start(); 
} 


     public void PhysicsThread() 
     { 
      int milliseconds = TimeSpan.FromTicks(111111).Milliseconds; 
      while(true) 
      { 
       if (threadUpdate.Elapsed.Milliseconds > milliseconds) 
       { 
        world.Step(threadUpdate.Elapsed.Milliseconds/1000.0f); 
        threadUpdate.Stop(); 
        threadUpdate.Reset(); 
        threadUpdate.Start(); 
       } 
      } 
     } 

這是一個不錯的方法來更新物理或應該有一些東西,我應該注意的事項?

回答

3

在遊戲中,您需要將物理更新與遊戲的幀速率同步。這是因爲你的渲染和遊戲將取決於你的物理引擎的每幀輸出。而你的物理引擎將依賴於每一幀的用戶輸入和遊戲玩法事件。

這意味着在一個單獨的線程上計算物理的唯一好處是它可以在獨立的CPU內核上運行,並與其他遊戲邏輯和渲染一起運行。 (這些日子對於PC來說是非常安全的,移動領域剛剛開始獲得雙核心。)

這允許他們同時運行物理和遊戲/渲染 - 但缺點是需要有一些機制以防止一個線程修改數據,而另一個線程正在使用該數據。這通常很難實現。當然,如果你的物理不是依賴於用戶輸入 - 如憤怒的小鳥或不可思議的機器(即:用戶按下「播放」和模擬運行) - 在這種情況下,你可能會提前計算你的物理模擬,記錄它的輸出以便回放。但不是阻塞主線程,而是將這個耗時的操作轉移到後臺線程 - 這是一個很好理解的問題。即使在錄製完成之前,您甚至可以開始在主線程中播放錄製內容!

+0

是的,我的大部分問題基本上都是由我的遊戲邏輯調用物理操作(如raycast)或我的物理引擎將碰撞回調發送到引擎的其餘部分引起的。然而,我不想實現一個只適用於特定類型遊戲的解決方案,因爲我試圖構建一個可以處理各種遊戲的遊戲引擎。問題是爲物理問題創建解決方案要求我重新編寫引擎的一部分,使其變得不那麼清晰和直接。我認爲清晰是爲了表現而作出的犧牲。 – tweetypi 2011-05-24 22:56:33

1

一般而言,您的方法沒有任何問題。將耗時的操作(如物理引擎計算)移動到單獨的線程通常是一個好主意。但是,我假設你的應用程序在用戶界面中包含了某種物理對象的可視化表示形式?如果是這種情況,你會遇到問題。

Silverlight中的UI控件具有線程關聯性,即無法在上面示例中創建的線程中更新它們的狀態。爲了更新它們的狀態,你將不得不通過Dispatcher調用,例如TextBox.Dispatcher.Invoke(...)。

另一種選擇是使用Silverlight BackgroundWorker。這是一個有用的小班,可以讓你做耗時的工作。它會將您的工作轉移到後臺線程,避免需要創建自己的System.Threading.Thread。它還會提供將結果封送回UI線程的事件。

更簡單!

+0

我在XNA中也是這樣做的(這是一款XNA/silverlight遊戲)。任何想法你的建議如何適用於XNA? – tweetypi 2011-05-24 10:13:02

+1

你正在創建一個WP7遊戲?如果是這樣,請查看網絡上的許多文章,例如http://www.codeproject.com/KB/windows-phone-7/BounceBall.aspx – ColinE 2011-05-24 10:16:07

+0

不幸的是,文章似乎沒有涵蓋線程,這是我遇到我的問題。我真的需要使用線程技術,因爲它給我帶來的性能提升是絕對巨大的,通常意味着一個口吃遊戲和流暢的幀速率之間的差異。我現在正在處理的遊戲在物理引擎中存在主要瓶頸,這是我需要關注優化的地方...... – tweetypi 2011-05-25 07:12:40