Unity面经-协程

一、Unity 协程与线程的本质区别

我用最清晰的表格总结:

特性Unity 协程线程(Thread / Task)
是否并行执行❌ 不并行(主线程调度)✔ 真正并行
是否多核利用❌ 不利用✔ 利用多核
是否可访问 Unity API✔ 可以❌ 不可以
是否安全修改 GameObject✔ 可以❌ 不可以(必须丢回主线程)
是否适合耗时计算❌ 不适合✔ 合适
是否适合执行流程脚本✔ 最适合一般
调度者Unity 引擎操作系统
性能成本极低较高

协程式unity级别,让主线程的逻辑按照时间或状态分步执行。

线程是操作系统级别,做真正的多核计算,不能操作Unity对象。

二、协程的应用场景

1. 分帧执行,比如生成一万个物体,每帧生成1000个。

2. 等待某个状态结束后做什么事。比如血量小于0死亡:

yield return new WaitUntil(() => hp <= 0);

3.在循环中等待,比如每一秒怎么样。

while (true)
{
    DoCheck();
    yield return new WaitForSeconds(1);
}

三、协程能做异步的原因

协程可以暂停。

协程由Unity调度,运行在主线程,不是多线程。

举例,比如逻辑A和逻辑B,A执行完30%暂停,然后执行逻辑B。

B执行完百分之40暂停,然后执行逻辑A。

A执行到百分之50暂停,然后执行逻辑B。

这样看,A和B是交替执行,造成了异步的效果。

四、协程的底层实现原理

底层原理的详细的分析

我的总结:

1. IEnumerator接口的样子

public interface IEnumerator
{
    object Current { get; }

    bool MoveNext();
    void Reset();
}

Current 是集合中当前迭代位置的元素。

MoveNext是移动到集合的下个位置,成功推进返回true,到达末尾返回false。

Reset()就是恢复到初始位置,为-1。

2. yield的作用

文章的说法是“利用yield关键字,只需要下面简单的几行代码,就可以快速定义一个迭代器”

// 由迭代器函数定义的迭代器
IEnumerator Test()
{
    yield return 1;
    Debug.Log("Surprise");
    yield return 3;
    yield break;
    yield return 4;
}

我更直白的理解:

Test函数返回的是一个“集合“,每个yield代码都是集合中的一个元素,这个元素中包含了移动到下一个元素位置的条件,unity调用IEnumerator中的MoveNext来移动到下一个元素。

3.MoveNext方法

MoveNext是关键,unity引擎什么时候调用MoveNext,迭代器或者说一个集合就尝试往下个元素移动。

比如yield return WaitForSeconds的意思就是,如果Current是WaitForSeconds类型,那么就等到达时间之后MoveNext。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值