2011-12-12 33 views
2

我正在用Javascript開發一個小型遊戲框架,並且已經完成了大部分的庫和低層次的東西,所以我沒有把注意力集中在遊戲對象系統上。在我以前的Java遊戲框架中,我使用了非常好用的組合,並且我將整個對象框架暴露給JS,這啓發了我開展這個項目的工作。在Java中,組合效果非常好,因爲你不再需要處理類型轉換,或者至少很少處理,因此所有內容都可以通過相同的管道傳遞。Javascript:複合vs原型設計

但是,在Javascript中,它使您能夠動態地將數據和方法添加到對象,我想知道是否最好跳過整個組合結構,但這裏主要的問題是性能。在數組中存儲對象列表並迭代它們(並直接調用它們的方法)是非常快的,並且具有易於事件傳播/冒泡的附加好處,其中作爲通過原型構建的對象需要穿過巨人檢查列表以查看它是否包含各種方法/數據。我認爲對於非實時應用程序,這可以正常工作,但不需要每秒渲染數百個對象30次以上。我要爲這兩種設計編寫一些測試,但是你們有沒有對此有任何意見?

注意:這是一個html5框架。

+0

+1有趣的問題,尤其是在遊戲開發的上下文中。 – helpermethod

回答

2

這個問題太寬泛,無法很好地回答。我會盡量縮小到兩位:

但這裏的主要問題是性能。

其中之一就是在出現問題後關注性能。

爲威盛 原型組成的對象將需要通過檢查一個巨大的列表中跑去看 如果它所含的各種方法/數據。

對於兩個,這是不正確的。您可以非常輕鬆地爲每個mixin添加一個標記方法 - 有效地將您的巨型列表摺疊爲一個並且只有一個。

例如:

Renderable = { 
    isRenderable: true 
    // render magic 
} 

myGameObject.extend(Renderable); 

更新

您可能還需要考慮的一個事件爲導向的方法。這將允許您觸發Render事件,並且訂閱的每個遊戲對象都將簡單地呈現它自己。沒有if語句。像(假):

RenderManager.subscribe = function(subscriber) { 
    this.subscribers.push(subscriber) 
} 
RenderManager.render = function() { 
    // loop over all subscribers and render with them 
} 

// when initializing, add game objects to the render system 
RenderManager.subscribe(myGameObject); 

// then from your main game loop 
RenderManager.render(); 
+0

大聲笑...你說「這不是真的」,但是,你似乎與自己的代碼相矛盾(如果isRenderable)所以是的,也許你沒有做一個類型/實例的支票,仍然明確地做出if語句。我更喜歡使用明確處理每種類型組件的子系統,以便您永遠不需要進行顯式檢查。 – Xealgo

+0

當然,您仍然希望對對象執行運行時類型檢查,以確保它是預期的類型。無論如何,我要做的是將複合材料和原型設計混合使用,這似乎是最合乎邏輯的。例如,組件幾乎可以完全依賴於原型設計,因爲遊戲對象只包含一個組件列表,可以在整個對象生命週期中輕鬆管理組件。 – Xealgo

+0

我不確定'大聲笑'是必要的。通過「巨大的列表」,我簡單地認爲你的意思是你必須對每個遊戲對象進行多次檢查,看看它是否支持某些行爲。我已經更新了我的答案,包括一個不包含if語句的方法,如果這是您的問題。 –