Unity3D 中的協(xié)同程序Coroutine

今天咱就說說協(xié)同程序coroutine酱畅。

什么是協(xié)同程序

先說說啥是協(xié)程:它的表現(xiàn)形式非常像線程留储,對(duì)線程有過接觸的朋友可能更理解我這句話的意思炼鞠,你沒接觸過線程,那么理解它會(huì)有一些難度眶明。但是它不存在線程安全問題,可以放心使用筐高。
是這樣的:在操作系統(tǒng)層面搜囱,也就是更古老的大神們,覺得“并發(fā)”是一個(gè)很時(shí)髦的東西柑土,很好使蜀肘,于是他們?cè)试S操作系統(tǒng)中開啟進(jìn)程。后來稽屏,他們覺得一個(gè)進(jìn)程中扮宠,如果也能并發(fā)該多好,那么線程應(yīng)運(yùn)而生(這些都是身為碼農(nóng)應(yīng)該知道的一些常識(shí):一個(gè)系統(tǒng)上可以運(yùn)行多個(gè)進(jìn)程狐榔,一個(gè)進(jìn)程可以并發(fā)多個(gè)線程)坛增。
但是由于我們的unity是單線程的,那么還有一句不這么耳熟能詳?shù)脑挘阂粋€(gè)線程可以多協(xié)程薄腻。于此看來收捣,coroutine可以說是在unity主線程中“并發(fā)”的很多協(xié)程。這個(gè)“并發(fā)”為什么加引號(hào)庵楷,這將是我們研究的重要內(nèi)容罢艾。介紹了協(xié)同的定義,那么可以研究一下它在項(xiàng)目中究竟會(huì)怎么用尽纽。下面就是面試考題中可能遇到的幾種協(xié)同程序的用法:

1.不使用協(xié)同啟動(dòng)一個(gè)返回迭代器的函數(shù)咐蚯。

void 家里來客人()
    {    
          沏茶();
          與客人聊天()蜓斧;
    }
    IEnumerator 沏茶()仓蛆;

2.在迭代器函數(shù)中,yield return 一個(gè)協(xié)同啟動(dòng)挎春。 如

void 家里來客人()
{
     StartCoroutine(沏茶())看疙;
     與客人聊天()豆拨;
}
IEnumerator 沏茶()
{
    yield return StartCoroutine(做水());
    找茶葉罐()能庆;
}
IEnumerator 做水()施禾;
void 找茶葉罐();

3.在迭代器函數(shù)中搁胆,直接啟動(dòng)一個(gè)協(xié)同弥搞。如

void 家里來客人()
{
     StartCoroutine(沏茶());
     與客人聊天()渠旁;
}
IEnumerator 沏茶()
{
    StartCoroutine(做水())攀例;
    找茶葉罐();
}
IEnumerator 做水()顾腊;
void 找茶葉罐()粤铭;

下面逐條分析一下把。

  • 對(duì)于第一條:這種用法杂靶,迭代器“沏茶”梆惯,根本不會(huì)被并發(fā),比如在這種情況下吗垮,雖然沏茶是一個(gè)迭代器函數(shù)垛吗,但是你如果這么執(zhí)行,也會(huì)是沏完了茶(徹底沏完了茶)再跟客人聊天烁登。如果沏茶很費(fèi)時(shí)間怯屉,那么不好意思,你在這段時(shí)間內(nèi)防泵,都不會(huì)跟客人聊天蚀之。這里迭代器等于白費(fèi)。相當(dāng)于普通函數(shù)捷泞。
  • 對(duì)于第二條:你在startcoroutine之后足删,立即開始并發(fā),也就是你一邊執(zhí)行沏茶锁右,一邊開始跟客人聊天了∈埽現(xiàn)在進(jìn)來看看你沏茶的時(shí)候。在沏茶的協(xié)同中咏瑟,你先yield return 做水拂到。這句話的意思就是,“等待做完水了”码泞,再開始找茶葉罐兄旬。值得注意的是,你在做水,找茶葉罐的時(shí)候领铐,已經(jīng)開始跟客人聊天了悯森。
  • 對(duì)于第三條:你一遍執(zhí)行沏茶,一遍與客人聊天绪撵。在你沏茶的時(shí)候瓢姻,你是一邊做水,一邊找茶葉罐的音诈。

對(duì)于這個(gè)例子來看呢幻碱。有這么幾條收獲:

  1. yield return 跟return 沒有任何關(guān)系,yield return xxx 翻譯成人話就是“等待xxx返回之后”细溅,是一個(gè)阻塞協(xié)同程序的操作褥傍。
  2. 開啟協(xié)同程序,實(shí)現(xiàn)了偽并發(fā)喇聊,雖說看起來像并發(fā)摔桦,但是還是有先后執(zhí)行次序,所以跟線程有本質(zhì)的不同——線程理論上來說承疲,先后次序是不可預(yù)知的——除非你用信號(hào)量等等進(jìn)行人為控制哈。
  3. 開啟協(xié)同程序鸥咖,必須得是一個(gè)返回迭代的函數(shù)燕鸽。否則編譯不過。但是返回迭代的函數(shù)可以不在協(xié)同中調(diào)用啼辣,這樣編譯是通過的啊研,但是基本不會(huì)這么寫,代碼不干凈鸥拧。

主要的骨頭已經(jīng)啃了党远,剩下一個(gè)就是協(xié)同程序什么時(shí)候才算完結(jié)?

  1. 碰見yield break——直接跳出攜程富弦,對(duì)某些判定失敗必須跳出的時(shí)候沟娱,比如加載AssetBundle的時(shí)候,WWW都失敗了腕柜,后邊加載bundle沒有必要了济似,這時(shí)候可以yield break。這個(gè)語句非常有用盏缤。
  2. 執(zhí)行到最后一行——最后一行不一定非得是 yield return xxx砰蠢;我經(jīng)常最后一句是一個(gè) excute delegate什么的。
  3. 補(bǔ)充:yield return null唉铜;yield return 0台舱; 均不算完結(jié)協(xié)同程序!L读鳌>和铩柜去!

弄懂了這些,自己去揣摩揣摩碰声,就能搞定協(xié)同啦诡蜓。難點(diǎn)就是這些。它雖然惡心胰挑,但是并不難蔓罚,希望對(duì)大家有幫助!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瞻颂,一起剝皮案震驚了整個(gè)濱河市豺谈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌贡这,老刑警劉巖茬末,帶你破解...
    沈念sama閱讀 223,126評(píng)論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異盖矫,居然都是意外死亡丽惭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門辈双,熙熙樓的掌柜王于貴愁眉苦臉地迎上來责掏,“玉大人,你說我怎么就攤上這事湃望』怀模” “怎么了?”我有些...
    開封第一講書人閱讀 169,941評(píng)論 0 366
  • 文/不壞的土叔 我叫張陵证芭,是天一觀的道長瞳浦。 經(jīng)常有香客問我,道長废士,這世上最難降的妖魔是什么叫潦? 我笑而不...
    開封第一講書人閱讀 60,294評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮湃密,結(jié)果婚禮上诅挑,老公的妹妹穿的比我還像新娘。我一直安慰自己泛源,他們只是感情好拔妥,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,295評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著达箍,像睡著了一般没龙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,874評(píng)論 1 314
  • 那天硬纤,我揣著相機(jī)與錄音解滓,去河邊找鬼。 笑死筝家,一個(gè)胖子當(dāng)著我的面吹牛洼裤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播溪王,決...
    沈念sama閱讀 41,285評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼腮鞍,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了莹菱?” 一聲冷哼從身側(cè)響起移国,我...
    開封第一講書人閱讀 40,249評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎道伟,沒想到半個(gè)月后迹缀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,760評(píng)論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蜜徽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,840評(píng)論 3 343
  • 正文 我和宋清朗相戀三年祝懂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拘鞋。...
    茶點(diǎn)故事閱讀 40,973評(píng)論 1 354
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嫂易,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出掐禁,到底是詐尸還是另有隱情,我是刑警寧澤颅和,帶...
    沈念sama閱讀 36,631評(píng)論 5 351
  • 正文 年R本政府宣布傅事,位于F島的核電站,受9級(jí)特大地震影響峡扩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜教届,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,315評(píng)論 3 336
  • 文/蒙蒙 一响鹃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧航闺,春花似錦荸恕、人聲如沸瓶蚂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春轩触,著一層夾襖步出監(jiān)牢的瞬間寞酿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評(píng)論 1 275
  • 我被黑心中介騙來泰國打工脱柱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留伐弹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,431評(píng)論 3 379
  • 正文 我出身青樓榨为,卻偏偏與公主長得像惨好,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子柠逞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,982評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容