目录
前言
从粉丝私信来的新需求,希望能详细理解一下携程。因为我初学的时候对携程也是半天没弄懂,所以很开心给你们打伞。
一、预备知识
这里讲的是理解携程必须懂的知识点。
1.主程
主程:主要程序
如果拿小说来举例,就是主人公,整个小说都是围绕主人公进行的,就算有其他剧情,也只是支线,如果主人公不希望支线存在,也就不存在了。那么这个支线,就是携程。
2.案例
人就是一直用主程和携程生活的例子。
主程 = 大脑
携程 = 四肢
大脑会给四肢下达指令,他们可以去干不同的事情,但是因为他们共用一个大脑,所以如果我让你左手画圆,右手画方,左脚画五角星,右脚画三角,你会反应不过来,因为大脑不够用了。
主程和携程共用cpu,主程卡了,携程一定受影响(大脑崩了,你还想干嘛!)
携程出问题,主程一定程度受影响。(这就看四肢是扭了一下,还是直接骨折了)
携程是被主程安排和控制的。(事都是大脑分配的)
但携程自己做事时,不需要大脑时时刻刻控制。(谁在卫生间不刷个手机呢!也没看拉不出来啊)
主程可以控制携程对cpu的占用程度。(你可以选择专心致志、全力以赴拉屎,也可以选择漫不经心,细水长流,当然,如果你全力以赴拉屎,可能看手机看的就慢了,都是相对的)
3.携程汇报
还记得小时候被老师控制的日子吗?
老师说,你写完语文作业就给我说一声。
老师说,你10分钟以后来找我。
老师说,你什么时候把这道题做对了,你才能回家!
怎么样,瑟瑟发抖了吧!!!!
所以携程必须要定时汇报,但是他肯定需要在老师上班时间汇报,不能半夜四点钟去老师家敲门:“嗨~我作业写完了,你要起来改作业吗?”会被打死!
4.主程的工作时间
主程的工作节奏就是帧率,理想情况下是0.02秒执行一次。就是update每次执行的时间。
很遗憾的是,我们计算机有时候会卡,或者配置不高,会比较慢,那么可能每次时间不一样,有的0.05秒,也可能这次0.04秒,下次0.01秒。有高有低的。
但不管具体多少秒执行一次,执行一次就是一回合。
二、携程应用
努力看到这里的宝宝,恭喜你们哦!接下来你们理解起来会很轻松。
1.简单携程
这里随便写了一个携程,会有常见的报错。(如图1所示)
因为携程是支线!干事情必须要和主线汇报!
2.携程汇报
知道要汇报,我们就要讨论一下,什么时间汇报。
yield return null; // 下一帧再执行后续代码
yield return 0; //(0可以是任意数字) 下一帧再执行后续代码
还记得之前说的,我们是回合制的吗?理想情况下0.02秒执行一次的事情。
这里就好像,你周末作业有2篇作文,老师对你说,大家不要一次性写完,一天一篇哦!
//作业:有两篇作文
IEnumerator DoHomeWork()
{
Debug.Log("写完了一篇作文");
//携程说:我写完一篇作文了
//主程说:不管现在还剩多少时间,先休息一下,下一帧(下一回合)再继续写
yield return null;
//因为后面没有别的 yield return了
//所以这里还有一层意思:后面写完就不用汇报了,玩去吧
Debug.Log("又写完了一篇作文");
//携程工作完了,自己休息去了
}
这里可能你疑问,为什么不一次性写完?
因为携程和主程是一个cpu(携程一直专心致志拉屎,主程玩手机就会慢呀!控制一下)
经过上面的例子,你再去看下面这些(常用)汇报内容:
//你等这回合先别干,其他人都干完了,再做你这个
//案例:这次考试,你等所有人都交完卷子了,你再交
//有这个的主要原因是,图画一般渲染的比较慢,有时候你需要等图片都显示完全了,再执行
yield return new WaitForEndOfFrame();//等待帧结束
//后面别干了,就到这吧
yield break; //直接结束该协程的后续操作
//等一秒再干
yield return new WaitForSeconds(1f);//等待1秒;
//你等另一个携程干完了,你再继续
yield return StartCoroution(/*某个协程*/);//等待某个协程执行完毕后再执行后续代码
//你等网络响应完了,你再干
yield return WWW();//等待WWW操作完成后再执行后续代码
//括号里的内容是true的时候再继续干
//案例:体育老师说,如果你们班主任让我上课,我再上
yield return new WaitUntil()//将协同执行直到 当输入的参数(或者委托)为true的时候
//括号里的内容是false的时候再继续干
//案例:女生对男朋友说什么时候你不抽烟了,再亲我!
yield return new WaitWhile()//将协同执行直到 当输入的参数(或者委托)为false的时候
还有别的汇报内容,大家可以去搜索,因为牵扯到其他的一些知识点,但意思就是这个意思。
3.携程开启和停止
携程写好了,在主程里去使用它,也可以强行停止。
//开始协程:
//方法一:直接写方法名
//优点:书写简单
//缺点:没法停止
StartCoroutine(MyCoroutine());
//方法二:声明一下再用
//优点:可以停止
//缺点:写起来麻烦
private Coroutine myCoroutine;
myCoroutine = StartCoroutine(MyCoroutine());
//方法二停止协程:
StopCoroutine(myCoroutine);
//方法三:用名字开始
//优点:可以停止
//缺点:写起来麻烦
StartCoroutine("MyCoroutine"); //开启方法名称为MyCoroutine的携程
//方法三停止协程:
StopCoroutine("MyCoroutine");
//通用
//停止当前对象上所有正在运行的协程
StopAllCoroutines();
三、总结
主程不能一个人干所有事情,而且主程不能等待,几乎一直在做事(玩游戏也不想死机硬等吧)
有时候也确实需要一些帮手,就和做饭一样,有时候你还是希望有两个锅吧。
这时候它需要别人帮帮他,所以他分配任务,他控制执行速度,把控重要的每一步,就和实习生的师傅,学生的家教一样。
至于大家想拿这个功能干嘛,就是仁者见仁智者见智了。
大家好,我是一个励志用简单语言讲解程序的up,欢迎大家私信需求!~~
感谢大家关注、点赞、收藏~~(づ ̄3 ̄)づ╭❤~