協同力量
用法
如果你的長時間執行操作依賴於非執行緒安全的 Unity API,請使用 Coroutines 將其拆分為多個幀並使應用程式保持響應。
協同程式還幫助每第 n 幀執行昂貴的操作,而不是每幀執行該操作。
在多個幀上拆分長時間執行的例程
協同程式有助於在多個幀上分配長時間執行的操作,以幫助保持應用程式的幀速率。
在程式上繪製或生成地形或產生噪聲的例程可能需要 Coroutine 處理。
for (int y = 0; y < heightmap.Height; y++)
{
for (int x = 0; x < heightmap.Width; x++)
{
// Generate pixel at (x, y)
// Assign pixel at (x, y)
// Process only 32768 pixels each frame
if ((y * heightmap.Height + x) % 32 * 1024) == 0)
yield return null; // Wait for next frame
}
}
上面的程式碼是一個易於理解的例子。在生產程式碼中,最好避免每畫素檢查檢查何時到
yield return
(可能每 2-3 行執行一次)並預先計算for
迴圈長度。
不經常執行昂貴的操作
協同程式可以幫助你不那麼頻繁地執行昂貴的操作,因此它不會像每幀執行時那樣大。
直接從手冊中獲取以下示例 :
private void ProximityCheck()
{
for (int i = 0; i < enemies.Length; i++)
{
if (Vector3.Distance(transform.position, enemies[i].transform.position) < dangerDistance)
return true;
}
return false;
}
private IEnumerator ProximityCheckCoroutine()
{
while(true)
{
ProximityCheck();
yield return new WaitForSeconds(.1f);
}
}
通過使用 CullingGroup API, 可以進一步優化接近度測試。
常見的陷阱
開發人員犯的一個常見錯誤是訪問協同程式之外的協同程式的結果或副作用。一旦遇到 yield return
語句,協同程式就會將控制權返回給呼叫者,並且可能尚未執行結果或副作用。要避免必須在協程外使用結果/副作用的問題,請檢查此答案 。