unity3d 协程电源

示例

用法

如果您需要长时间运行的操作依赖于非线程安全的Unity API,请使用协程将其拆分为多个帧并保持应用程序响应速度。

协程还有助于在第n帧执行昂贵的操作,而不是在每帧执行该操作。

在多个框架上分割长时间运行的例程

协程有助于将长时间运行的操作分布在多个帧上,以保持应用程序的帧率。

程序上绘制或生成地形或生成噪声的例程是可能需要协程处理的示例。

for (int y = 0; y < heightmap.Height; y++) 
{
    for (int x = 0; x < heightmap.Width; x++)
    {
        // 在(x,y)处生成像素
        // 在(x,y)处分配像素
        
        // 每帧仅处理32768像素
        if ((y *heightmap.Height+ x) % 32 * 1024) == 0)
            yield return null; // 等待下一帧
    }
}

上面的代码是一个易于理解的示例。在生产代码中,最好避免按像素检查以检查何时进行检查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遇到语句,就会将控制权返回给调用者,并且结果或副作用可能尚未执行。要避开必须在协程外部使用结果/副作用的问题,请检查此答案。