2011-06-14 34 views
4

我想在純JavaScript和html5中開發遊戲,而不使用任何第三方插件。我面臨的問題是我無法找到一種方法將遊戲的不同「模塊」分成獨立的線程,例如渲染作業,遊戲邏輯,資產加載等等。

Web Workers似乎能夠將代碼分離到不同的線程中,但問題在於它們之間傳遞的信息有限。例如,對於渲染作業,因爲工作線程無法共享內存,所以我需要爲整個「世界」傳遞所有實體,網格,紋理等等,以便每次更新遊戲。它可以進行優化,比如僅在初始化時發送靜態對象(網格,紋理),然後僅發送更新對象的狀態(它是世界變換),但它仍然不可取。

用於遊戲開發的JavaScript多線程

有沒有辦法在它們之間發送大數據或讓它們共享一些對象?或者是否有完全實現真正多線程的不同方法?我知道有更簡單的方法來實現這個使用插件/齒輪,但我只需要使用可用的方法在開放的網頁;

+0

儘管沒有從JavaScript中尋求「真正的」並行性的有效性中拿走任何東西,但是您提出問題的方式讓我建議您閱讀基於事件的編程模型。作爲一個例子(對於使用* model的軟件,沒有用JS編寫),基於事件的nginx webserver遠遠超過基於線程的Apache *,特別是在負載較重的情況下。舉個例子,不使用那些更傳統的並行性手段在Javascript中是部分故意的,並解釋爲什麼「web工作者」還沒有被廣泛使用/使用。 – 2011-06-14 20:09:55

回答

2

JavaScript的Web Worker在某種程度上是一個更好的併發編程模型。例如,它是事件驅動的,沒有共享對象。這意味着你不能進入網格鎖定(因爲根本沒有鎖),並且一個對象不能通過同時由兩個線程修改而進入無效狀態。

問題是你不能輕易地堆疊在這個模型的頂部的傳統遊戲系統。所以你需要以一種新的方式設計遊戲系統來採用這種編程模式,我認爲這可能是昂貴的。

4

你可能想看看網絡工作者,我沒有經驗與他們,但聽說過他們。可能引導你走向正確的方向。

http://ejohn.org/blog/web-workers/

+0

工作者線程我的意思是Web Workers。我做了一個小小的編輯來澄清這一點。就像我說的,工作者似乎能夠實現多線程,但是我可以在他們之間共享信息的方式存在問題。 – 2011-06-14 20:07:02

+0

那麼,沒有別的。 JS以「並行」方式運行事件的第一種方法是基於事件的編程。這當然只使用一個CPU(核心),但在這個極限內的規模非常好。網絡工作者(就真實世界的可用性而言)最近的新增加是迄今爲止唯一一種使用一個(JS)軟件來擴展一次CPU(核心)的實用方法。 – 2011-06-14 20:13:24

0

web-workers是JS把多線程最接近。
此刻。
句號。

0

無網絡工作者沒有真正的方法來做我知道的JavaScript多線程。儘管如此,您可以使用一些邏輯來確定應該花費多少時間來完成特定任務的優先順序。你可以製作將信息存儲在狀態中的函數(因此可以退出循環,然後在稍後恢復)。每個循環只是知道它保存了多少時間,然後保存它的狀態並退出函數。

所以for循環將有一個時間條件,太...

//Loop over some iterator, exit if time is up 
for (i = 1; i < max || timeNotUp(); i++) 
{ 
} 

//If exiting normally 
if (i == max) 
{ //do somthing 
} 
//otherwise, save state 
else 
{ 
    this.i = i; 
    this.otherStuff = otherStuff; 
} 

你絕對可以優先考慮你的代碼這種方式。但是,有缺點。保存你的狀態並不會導致清理容易跟蹤代碼(尤其是循環內的循環)。它也不是那麼快,因爲你不斷檢查時間並保存狀態。