当前位置:   article > 正文

Unity C#中协程/携程Coroutine简单易懂详解_c# 携程

c# 携程

目录

前言

一、预备知识

1.主程

2.案例

3.携程汇报

4.主程的工作时间

二、携程应用

1.简单携程

2.携程汇报

3.携程开启和停止

三、总结


前言

从粉丝私信来的新需求,希望能详细理解一下携程。因为我初学的时候对携程也是半天没弄懂,所以很开心给你们打伞。

一、预备知识

这里讲的是理解携程必须懂的知识点。

1.主程

主程:主要程序

如果拿小说来举例,就是主人公,整个小说都是围绕主人公进行的,就算有其他剧情,也只是支线,如果主人公不希望支线存在,也就不存在了。那么这个支线,就是携程。

2.案例

人就是一直用主程和携程生活的例子。

主程 = 大脑

携程 = 四肢

大脑会给四肢下达指令,他们可以去干不同的事情,但是因为他们共用一个大脑,所以如果我让你左手画圆,右手画方,左脚画五角星,右脚画三角,你会反应不过来,因为大脑不够用了。

主程和携程共用cpu,主程卡了,携程一定受影响(大脑崩了,你还想干嘛!)

携程出问题,主程一定程度受影响。(这就看四肢是扭了一下,还是直接骨折了)

携程是被主程安排和控制的。(事都是大脑分配的)

但携程自己做事时,不需要大脑时时刻刻控制。(谁在卫生间不刷个手机呢!也没看拉不出来啊)

主程可以控制携程对cpu的占用程度。(你可以选择专心致志、全力以赴拉屎,也可以选择漫不经心,细水长流,当然,如果你全力以赴拉屎,可能看手机看的就慢了,都是相对的

3.携程汇报

还记得小时候被老师控制的日子吗?

老师说,你写完语文作业就给我说一声。

老师说,你10分钟以后来找我。

老师说,你什么时候把这道题做对了,你才能回家!

怎么样,瑟瑟发抖了吧!!!!

所以携程必须要定时汇报,但是他肯定需要在老师上班时间汇报,不能半夜四点钟去老师家敲门:“嗨~我作业写完了,你要起来改作业吗?”会被打死!

4.主程的工作时间

主程的工作节奏就是帧率,理想情况下是0.02秒执行一次。就是update每次执行的时间。

很遗憾的是,我们计算机有时候会卡,或者配置不高,会比较慢,那么可能每次时间不一样,有的0.05秒,也可能这次0.04秒,下次0.01秒。有高有低的。

不管具体多少秒执行一次,执行一次就是一回合。

二、携程应用

努力看到这里的宝宝,恭喜你们哦!接下来你们理解起来会很轻松。

1.简单携程

这里随便写了一个携程,会有常见的报错。(如图1所示)

图1 新建携程

因为携程是支线!干事情必须要和主线汇报!

2.携程汇报

知道要汇报,我们就要讨论一下,什么时间汇报。

  1. yield return null; // 下一帧再执行后续代码
  2. yield return 0; //(0可以是任意数字) 下一帧再执行后续代码

还记得之前说的,我们是回合制的吗?理想情况下0.02秒执行一次的事情。

这里就好像,你周末作业有2篇作文,老师对你说,大家不要一次性写完,一天一篇哦!

  1. //作业:有两篇作文
  2. IEnumerator DoHomeWork()
  3. {
  4. Debug.Log("写完了一篇作文");
  5. //携程说:我写完一篇作文了
  6. //主程说:不管现在还剩多少时间,先休息一下,下一帧(下一回合)再继续写
  7. yield return null;
  8. //因为后面没有别的 yield return了
  9. //所以这里还有一层意思:后面写完就不用汇报了,玩去吧
  10. Debug.Log("又写完了一篇作文");
  11. //携程工作完了,自己休息去了
  12. }

这里可能你疑问,为什么不一次性写完?

因为携程和主程是一个cpu(携程一直专心致志拉屎,主程玩手机就会慢呀!控制一下) 

经过上面的例子,你再去看下面这些(常用)汇报内容:

  1. //你等这回合先别干,其他人都干完了,再做你这个
  2. //案例:这次考试,你等所有人都交完卷子了,你再交
  3. //有这个的主要原因是,图画一般渲染的比较慢,有时候你需要等图片都显示完全了,再执行
  4. yield return new WaitForEndOfFrame();//等待帧结束
  5. //后面别干了,就到这吧
  6. yield break; //直接结束该协程的后续操作
  7. //等一秒再干
  8. yield return new WaitForSeconds(1f);//等待1秒;
  9. //你等另一个携程干完了,你再继续
  10. yield return StartCoroution(/*某个协程*/);//等待某个协程执行完毕后再执行后续代码
  11. //你等网络响应完了,你再干
  12. yield return WWW();//等待WWW操作完成后再执行后续代码
  13. //括号里的内容是true的时候再继续干
  14. //案例:体育老师说,如果你们班主任让我上课,我再上
  15. yield return new WaitUntil()//将协同执行直到 当输入的参数(或者委托)为true的时候
  16. //括号里的内容是false的时候再继续干
  17. //案例:女生对男朋友说什么时候你不抽烟了,再亲我!
  18. yield return new WaitWhile()//将协同执行直到 当输入的参数(或者委托)为false的时候

还有别的汇报内容,大家可以去搜索,因为牵扯到其他的一些知识点,但意思就是这个意思。

3.携程开启和停止

携程写好了,在主程里去使用它,也可以强行停止。

  1. //开始协程:
  2. //方法一:直接写方法名
  3. //优点:书写简单
  4. //缺点:没法停止
  5. StartCoroutine(MyCoroutine());
  6. //方法二:声明一下再用
  7. //优点:可以停止
  8. //缺点:写起来麻烦
  9. private Coroutine myCoroutine;
  10. myCoroutine = StartCoroutine(MyCoroutine());
  11. //方法二停止协程:
  12. StopCoroutine(myCoroutine);
  13. //方法三:用名字开始
  14. //优点:可以停止
  15. //缺点:写起来麻烦
  16. StartCoroutine("MyCoroutine"); //开启方法名称为MyCoroutine的携程
  17. //方法三停止协程:
  18. StopCoroutine("MyCoroutine");
  19. //通用
  20. //停止当前对象上所有正在运行的协程
  21. StopAllCoroutines();

三、总结

主程不能一个人干所有事情,而且主程不能等待,几乎一直在做事(玩游戏也不想死机硬等吧)

有时候也确实需要一些帮手,就和做饭一样,有时候你还是希望有两个锅吧。

这时候它需要别人帮帮他,所以他分配任务他控制执行速度把控重要的每一步,就和实习生的师傅,学生的家教一样。

至于大家想拿这个功能干嘛,就是仁者见仁智者见智了。

大家好,我是一个励志用简单语言讲解程序的up,欢迎大家私信需求!~~

感谢大家关注、点赞、收藏~~(づ ̄3 ̄)づ╭❤~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/756864
推荐阅读
相关标签
  

闽ICP备14008679号