2014-03-05 41 views
2

我最近才知道jMonkey只在一個線程上運行,這是它的openGL渲染線程。但是我無法完全理解它。我可以理解它在單個更新循環上執行所有更新和初始化()調用,但輸入應獨立於此更新循環,否則它將成爲輪詢機制。jMonkey和Nifty中的線程?

  1. 當jMonkey應用程序啓動時會發生什麼。它需要做的三項任務是運行更新循環,運行初始化應用程序狀態的方法一次,進行渲染並不斷迎合事件?它如何通過單個線程管理所有這些?
  2. 當我在另一個應用程序狀態的初始化方法中添加新的應用程序狀態時會發生什麼?
  3. 在輸入處理輸入管理器中通知各個監聽器有關事件。 nifty回調事件如何說onClick()是在同一個渲染循環中處理的?
  4. 最後,這個listen-update-render循環以什麼順序運行,我們可以在哪裏找到與之相關的代碼?

回答

3

jME使用了一種在很多遊戲引擎中很常見的方法(也用於其他一些用戶界面庫(如Swing))。

遊戲引擎所做的一切都是在一個線程中完成的。這可以稱爲LWJGL線程,但是由於jME可以使用LWJGL的替代方法,所以稱其爲「渲染線程」或僅稱爲「jME線程」更通用。

確實在Render線程上做了一切,它確實使用輪詢機制。例如,如果您按住「左」鍵,則每個框架的相關控件或應用程序狀態將在渲染線程上調用,並將向左移動由tpf修改的量。 Tpf是每幀時間,對於保持平滑移動並讓遊戲系統以相同的速度運行而不受幀速率的影響非常重要。

jME3中唯一通常使用獨立線程的是物理引擎。它有一個線程用於進行物理更新,然後使用適當的機制將更改推送到Render線程。系統會爲您處理這個問題,但這不是您需要擔心的問題。

  1. 線程圍繞遊戲循環運行。每次循環時,它都會檢查它需要做的事情(比如排入隊列的任務,初始化應用程序狀態,渲染等等。它會在每個活動的控制器和控件等中調用更新)。一旦完成更新,它就會執行渲染。所有這些都發生在每一幀,但電腦速度非常快,以至於它仍然可以處理所有這些,並以良好的幀速率呈現遊戲。

  2. 這是一個實現細節,你不需要擔心,除非知道它肯定會工作。實際上,添加會在下一幀中排隊並處理,我認爲。

  3. 一切都從相同的循環處理。 jME打電話給Nifty以允許Nifty進行處理。作爲處理的一部分,Nifty檢測事件並將其從回調中觸發。這意味着回調已經進入渲染線程,因此您可以安全地修改場景圖形。 jME使用一些專門編寫的集合(如SafeArrayList)來允許您在迭代場景圖的同時修改場景圖。

  4. 更新,渲染,更新,渲染等。當檢測到更新時,事件觸發通常作爲更新過程的一部分發生。要通過查看Application類來查找代碼,您應該能夠通過從start()調用中查找主要遊戲循環。

的jME3線程教程介紹的這一個公平的量:

http://hub.jmonkeyengine.org/wiki/doku.php/jme3:advanced:multithreading

+0

感謝。我已經理解了大部分內容(特別是與jme的互動),除了一件事情。輸入被捕獲爲OS中的中斷。他們如何在jME中排隊等候。涉及的步驟是什麼? – simar

+0

@simar這是由輸入經理處理,我不熟悉細節,對不起。 –