簡體   English   中英

通過調用協程導致Unity3D性能問題

[英]Unity3D performance issue by calling Coroutines

我正在做一個有AI的國際象棋游戲。

有一些處理游戲規則的函數,例如DoMove()DoSkill()

但是由於某些原因(大多數是為了顯示效果很酷),函數的返回類型是IEnumerator而不是void 因此,該函數的用法如下所示:

yield return StartCoroutine(DoSkill());

現在問題來了,人工智能是一項繁重的工作,但是我聽說Unity的協程不適合進行繁重的計算。 當我將函數更改為IEnumerator ,AI的速度顯然變得非常慢。

我確定AI中不會執行任何WaitForSeconds (someFloat)(我使用一些參數&if / else來跳過它),如果我一次又一次連續調用StartCoroutine ,似乎性能真的很差。

我能想到的可能解決方案是編寫兩種DoSkill()函數,一個返回類型為void ,另一個為IEnumerator 但這確實不是一個好方法。 因為我必須維護許多類似的功能,而且也很丑陋。

任何建議將不勝感激。

協程沒有什么神奇的-協程是一種功能,可以在執行過程中不斷放棄控制,並在下次泵送時繼續運行。 它們的存在確實允許開發人員避免編寫多線程代碼。

它們無法進行大量計算的原因是它們在主線程中執行,因此任何長時間運行的代碼都會有效地破壞您的幀速率。

它們在您知道可以做一些確定性工作並推遲下一次工作的地方就可以工作,例如處理下載的字節流,復制數據等。因此,如果以60FPS平穩運行,則您有16 ms的時間可以完成所有工作在一個框架中,繁重的計算可能會隨時間變化,並且很難提前知道。 如果您總共超過16毫秒(包括計算在內的所有內容),FPS將會變慢,並且游戲會顯得生澀。

我建議您在后台線程中運行計算。 基本上是:

using UnityEngine;
using System.Threading;

public class ChessAI : MonoBehaviour
{
  Thread aiThread;

  void StartAI()
  {
    aiThread = new Thread(new ThreadStart(AIThread));
    aiThread.Start();
  }

  void AIServer()
  {
    // do stuff here - be careful of accessing data being changed by main thread
  }

  public void OnApplicationQuit()
  {
    // It is crucial in the editor that we stop the background thread when we exit play mode
    aiThread.Abort();
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM