2013-09-21 64 views
3

對於代碼練習和改進目的,我正在編寫一個簡單的遊戲(目前它的通用程度足以成爲遊戲引擎)。我現在有很多setInterval調用運行,即每個「實體」(預製/播放器)看着按鍵,檢查衝突,更新位置引用等。我只是想知道什麼樣的性能問題(如果有的話)可能來自大量單獨的setIntervals。他們之間的時間關係並不重要,所以我並不擔心他們不同步(反正他們有稍微不同的時間間隔),但是會有一個循環遍歷所有實體來運行所有檢查的單個setInterval更高效?我唯一擔心的是該功能可能需要比間隔時間更長的時間。創造新的時間間隔是否會產生足夠的壓力讓人擔心,當每個人做了相當少量的時候?多用途特定設置間隔或單個超級間隔

回答

3

首先,我不會使用setInterval,因爲如果回調中的代碼執行的時間比間隔長,那麼回調可能會一個接一個堆疊併發生。

至於有多個計時器,我不認爲這是一個好主意,即使你不關心同步。如果你想調節你的遊戲速度,它會讓整體事情太複雜,無法保持,並且會變成一場噩夢。我肯定會去一個計時器。

另外,如果您不知道,那麼requestAnimationFrame函數已針對執行動畫進行了優化,因此您可以使用該函數代替setTimeout。如果瀏覽器能跟上,它基本上會以60fps的速度調用。

您可以將timestamp作爲參數傳遞給傳遞給​​的回調函數,以確定自上次遊戲循環迭代以來經過了多長時間。

+0

對,我已經簡要地查看了requestAnimationFrame方法,但從未做過任何事情。我已經開始重新處理操作並添加了框架的遊戲「蜱」。爲了保持代碼在邏輯上是分開的,但是我在其他區域添加了遊戲的「打勾功能」。需要看看這個功能對於我嘗試實現的功能有多好,但現在肯定會+1 – SmokeyPHP

+0

@SmokeyPHP你最終做了什麼?你是否考慮接受答案? – plalx

+0

嗯,自從問這個問題以來,我並沒有做太多的事情,因爲它只是一個小方面的項目,但它看起來像是要解決問題。我已經設置了一種動態添加/刪除流程的方法,以便每個tick/frame運行。每個人都可以指定不同的延遲。看起來確實如此,所以如果問題突然出現,那麼確實會接受並創建一個新問題 - 感謝您的意見 – SmokeyPHP