2015-08-24 88 views
2

Unity如何對所有輸入事件使用輪詢,如果有新事件檢查每個更新循環是否非常低效?如果我有1級百萬的對象做每一個更新週期我將承擔不斷輪詢會顯著減慢系統..Unity3D Input.GetKeyUp()輪詢效率低下?

public void Update() { 
     if (Input.GetKeyUp(KeyCode.Escape)) { 
      // escape clicked 
     } 
    } 

爲什麼會出現這樣的事:

public void Start() { 
     Input.addKeyUpListener(KeyCode.Escape, delegate { 
      // escape clicked 
     }); 
    } 
+1

爲什麼你會有一百萬個對象檢查輸入? – rutter

回答

5

注意團結是而不是每次調用其中一種方法時輪詢系統 - 而是輪詢每幀一次,然後緩存該值,如ResetInputAxes函數所證明。

這不是唯一的地方Unity做的東西看起來很瘋狂,但在代碼較低的層次上可能更有效 - 請記住,Unity對運行時維護了很多定製(特別是垃圾收集和構建)與標準C#不同。

還要注意,回調邏輯雖然對於處理程序和一般很長的對象(如單例和系統)非常有用,但對於通常在遊戲的整個生命週期內通常會收集和創建多次的腳本來說並不是那麼好。由於Unity只展示了使用代碼創建腳本的能力,因此輪詢更有意義,而不是使用需要附加,處理和分離行爲以避免錯誤的回調。

+0

好吧知道,聽起來他們仍然可以提供一些回調邏輯,這樣我就可以編寫一些更好的邏輯,而無需包裝完整的輸入系統我自己 –

+0

由於一般腳本的死亡率,實際上有一些回調邏輯問題 - 我將把這個註釋整合到我的答案中 – David