You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity/C#中如何让协程运行速度快于Update()?

解决Unity协程被帧率限制,实现高频率代码执行的方案

你的问题核心是协程默认按帧调度(yield return等待一帧),导致执行频率被帧率限制。要实现每秒数千次的执行频率,以下是几种可行方案:

1. 调整协程的等待逻辑,按时间间隔调度

把协程里的帧等待改成按固定时间间隔等待,直接指定每次执行的时间间隔(比如目标8000次/秒,间隔就是1f/8000f)。这种方式仍在主线程执行,适合不需要跨线程的Unity API调用(比如你的audioSource.GetOutputData)。

修改后的代码示例:

private float targetExecutionRate = 8000f;
private float executionInterval = 1f / 8000f;
private IEnumerator SampleRateCoroutine()
{
    while (true)
    {
        // 执行你的核心逻辑
        audioSource.GetOutputData(dataOut, 0);
        updateTiming = Mathf.Round(1 / (Time.time - prevCoroutineTime));
        prevCoroutineTime = Time.time;

        // 等待指定时间间隔,而非一帧
        yield return new WaitForSecondsRealtime(executionInterval);
    }
}

注意:如果单次逻辑执行时间超过设定的间隔,实际执行频率会低于目标值,因为协程必须等当前逻辑完成后才会进入等待。

2. 在Update中批量执行,保证总频率

通过累计帧时间,计算每帧需要执行的次数,批量处理逻辑。这种方式能保证整体执行频率接近目标值,避免单帧等待的限制。

代码示例:

private float targetExecutionRate = 8000f;
private float accumulatedTime = 0f;

private void Update()
{
    accumulatedTime += Time.deltaTime;
    // 计算当前帧需要执行的次数
    int executeCount = Mathf.FloorToInt(accumulatedTime * targetExecutionRate);
    
    if (executeCount > 0)
    {
        // 扣除已分配的时间,避免重复计算
        accumulatedTime -= executeCount / targetExecutionRate;
        
        // 批量执行逻辑
        for (int i = 0; i < executeCount; i++)
        {
            audioSource.GetOutputData(dataOut, 0);
            updateTiming = Mathf.Round(1 / (Time.time - prevCoroutineTime));
            prevCoroutineTime = Time.time;
        }
    }
}

注意:如果单次逻辑执行耗时较长,批量执行会增加单帧的CPU负载,可能导致帧率下降,需要根据实际性能调整目标频率或优化逻辑。

关键注意事项

  • 所有Unity的音频API(比如GetOutputData)必须在主线程执行,不能用子线程,否则会触发报错。
  • 高频率执行代码必然增加CPU消耗,务必在目标设备上测试性能,避免游戏卡顿。
  • 如果逻辑允许,可以合并多次GetOutputData调用,一次性处理更多数据,减少API调用次数,提升执行效率。

内容的提问来源于stack exchange,提问作者PhotonGamer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 07:42:44