
开场小明的协程在测试机跑得丝滑,到了低端机就帧率暴跌。Profiler 一抓,协程调度的开销居然占了主线程好几个百分点——可他代码里就StartCoroutine了几条简单的WaitForSeconds。他想去翻"Unity 协程调度器的源码",结果发现一个残酷事实:Unity 的引擎原生层(C++)并不开源,官方文档对yield return内部实现几乎只字未提。本文的做法是:以 C# 层可以实锤的部分(IL、公共 API、官方文档承诺的恢复时机)为地基,用逆向工程和社区公认的等效模型去逼近引擎侧的行为。文中所有引擎内部的结构、命名都是等效模型,不是官方源码——但这个模型足以解释你观察到的每一个协程现象,也足以指导性能优化。一、C# 语言层:可以实锤的部分1.1 状态机回顾yield return是编译器语法糖:你的IEnumerator方法被重写成一个嵌套状态机类,局部变量提升为字段,每个yield是MoveNext()里switch的一个case边界(完整推导见本系列《编译器在背后施展的状态机魔法》一篇,此处不重复)。对本文来说只需记住一个结论:引擎和协程之间的全部通信,就是两个调用:引擎调MoveNext(),协程通过Current交出一个对