跟諸子學(xué)游戲 unity3d 協(xié)程

在unity中方法一般是在一幀之內(nèi)執(zhí)行完畢的,當(dāng)方法耗時(shí)的時(shí)候,會(huì)產(chǎn)生幀率下降的情況.

Unity中的協(xié)程:

1:一個(gè)分部執(zhí)行字逗,遇到條件(yield return 語句)會(huì)掛起,直到條件滿足才會(huì)被喚醒繼續(xù)執(zhí)行后面的代碼宅广。

2:Unity在每一幀(Frame)都會(huì)去處理對(duì)象上的協(xié)程葫掉。Unity主要是在LateUpdate()后去處理協(xié)程(檢查協(xié)程的條件是否滿足),相當(dāng)于update函數(shù)加上代碼執(zhí)行位置,上下文環(huán)境.

3:Unity在每幀做的工作就是:調(diào)用 協(xié)程(迭代器)MoveNext() 方法,如果返回 true 跟狱,就從當(dāng)前位置繼續(xù)往下執(zhí)行俭厚。

4:采用分幀概念執(zhí)行,比如一個(gè)方法需要100W幀才能執(zhí)行完畢,用了協(xié)程之后可以將其擴(kuò)展到200W幀執(zhí)行,并不影響主線程.

使用StartCoroutine()函數(shù)來調(diào)用協(xié)程函數(shù)

1: public Coroutine StartCoroutine(IEnumerator routine);??

2:public Coroutine StartCoroutine(string methodName, [DefaultValue("null")] object value);

3: public Coroutine StartCoroutine(string methodName);

4: public Coroutine StartCoroutine_Auto(IEnumerator routine);

結(jié)束方法:

public void StopAllCoroutines();

public void StopCoroutine(string methodName);

public void StopCoroutine(IEnumerator routine)

public void StopCoroutine(Coroutine routine);

通過yield這個(gè)特殊的屬性可以在任何位置、任意時(shí)刻暫停,也可以在指定的時(shí)間或事件后繼續(xù)執(zhí)行驶臊,而不影響上一次執(zhí)行的就結(jié)果.例子:


例子


協(xié)程并不會(huì)在Unity中開辟新的線程來執(zhí)行挪挤,其執(zhí)行仍然發(fā)生在主線程中叼丑。當(dāng)我們有較為耗時(shí)的操作時(shí),可以將該操作分散到幾幀或者幾秒內(nèi)完成扛门,而不用在一幀內(nèi)等這個(gè)操作完成后再執(zhí)行其他操作鸠信。例子:


打印1


例子1


打印2


例子2

協(xié)程在實(shí)現(xiàn)過程中我們需要注意yield調(diào)用的時(shí)機(jī),執(zhí)行較為復(fù)雜的計(jì)算時(shí)尖飞,如果在時(shí)間上沒有嚴(yán)格的先后順序症副,我們可以每幀執(zhí)行一次循環(huán)來完成計(jì)算,或者每幀執(zhí)行指定次數(shù)的循環(huán)來防止在程序運(yùn)行中出現(xiàn)的卡頓現(xiàn)象政基。

比如在for循環(huán)中 用一個(gè)if(i%2==0){yield return null;}進(jìn)行每幀執(zhí)行2次for循環(huán).

yield return null/0; // 下一幀再執(zhí)行后續(xù)代碼

yield return 任意數(shù)字;// 任意數(shù)字 幀后 再執(zhí)行后續(xù)代碼

yield break; //直接結(jié)束該協(xié)程的后續(xù)操作

yield return asyncOperation;//等異步操作結(jié)束后再執(zhí)行后續(xù)代碼

yield return StartCoroution(/*某個(gè)協(xié)程*/);//等待某個(gè)協(xié)程執(zhí)行完畢后再執(zhí)行后續(xù)代碼

yield return WWW();//等待WWW操作完成后再執(zhí)行后續(xù)代碼

yield return new WaitForEndOfFrame();//等待幀結(jié)束,等待直到所有的攝像機(jī)和GUI被渲染完成后贞铣,在該幀顯示在屏幕之前執(zhí)行

yield return new WaitForSeconds(0.3f);//等待0.3秒,一段指定的時(shí)間延遲之后繼續(xù)執(zhí)行沮明,在所有的Update函數(shù)完成調(diào)用的那一幀之后(這里的時(shí)間會(huì)受到Time.timeScale的影響);

yield return new WaitForSecondsRealtime(0.3f);//等待0.3秒辕坝,一段指定的時(shí)間延遲之后繼續(xù)執(zhí)行,在所有的Update函數(shù)完成調(diào)用的那一幀之后(這里的時(shí)間不受到Time.timeScale的影響);

yield return WaitForFixedUpdate();//等待下一次FixedUpdate開始時(shí)再執(zhí)行后續(xù)代碼

yield return new WaitUntil()//將協(xié)同執(zhí)行直到 當(dāng)輸入的參數(shù)(或者委托)為true的時(shí)候....如:yield return new WaitUntil(() => frame >= 10);

yield return new WaitWhile()//將協(xié)同執(zhí)行直到 當(dāng)輸入的參數(shù)(或者委托)為false的時(shí)候.... 如:yield return new WaitWhile(() => frame < 10);

yield 概念解析? ?:當(dāng)你“yield”一個(gè)方法時(shí)荐健,你相當(dāng)于說了酱畅,“現(xiàn)在停止這個(gè)方法,然后在下一幀(或者? 看return后面的條件)中從這里重新開始江场!”

IEnumerator方法 的返回值 表示這個(gè)方法的狀態(tài),StartCoroutine需要記錄,然后進(jìn)行調(diào)用.

注意:

1:當(dāng)某一個(gè)腳本中的協(xié)程在執(zhí)行過程中纺酸,如果我們將該腳本的enable設(shè)置為false,協(xié)程不會(huì)停止址否。只有將掛載該腳本的物體設(shè)置為SetActive(false)時(shí)才會(huì)停止,或者銷毀該物體餐蔬。

2:Coroutine co = StartCoroutine(...)的返回值co 在沒有yield return返回時(shí),co為null,不能使用.

3:StopAllCoroutines()方法表示停止這個(gè)物體上這個(gè)類的協(xié)程全部停止,其他物體上的類的協(xié)程不停止.

4:協(xié)程不是線程,也不是異步執(zhí)行的佑附。協(xié)程和 MonoBehaviour 的 Update函數(shù)一樣也是在MainThread中執(zhí)行的樊诺。使用協(xié)程你不用考慮同步和鎖的問題.? 延時(shí)(等待一段時(shí)間)執(zhí)行代碼,等待某個(gè)操作執(zhí)行完成之后(比如一幀之后),再執(zhí)行后面的代碼.

5:協(xié)程是每幀的LateUpdate()后去運(yùn)行,在start update?LateUpdate方法中都調(diào)用一個(gè)協(xié)程,前后都打印log日志,yield return null 等測(cè)試.

6:一個(gè)空的/最簡(jiǎn)單的協(xié)程,也至少要執(zhí)行2幀 例子:IEnumerator work(){yield return null};啟動(dòng)一次,也要執(zhí)行至少2幀.

7:一個(gè)MONO中開啟多個(gè)協(xié)程時(shí),產(chǎn)生的調(diào)用順序

start方法里面開啟
Text1()/ Text2()/ Text3()類似

結(jié)果:

第一次運(yùn)行
隨后的調(diào)用順序
協(xié)程


PS:東西太多,無一一測(cè)試,如果錯(cuò)誤,請(qǐng)指出,我所有的文章皆站在巨人的肩膀上寫出.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市音同,隨后出現(xiàn)的幾起案子词爬,更是在濱河造成了極大的恐慌,老刑警劉巖权均,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件顿膨,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡叽赊,警方通過查閱死者的電腦和手機(jī)虽惭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛇尚,“玉大人芽唇,你說我怎么就攤上這事。” “怎么了匆笤?”我有些...
    開封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵研侣,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我炮捧,道長(zhǎng)庶诡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任咆课,我火速辦了婚禮末誓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘书蚪。我一直安慰自己喇澡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開白布殊校。 她就那樣靜靜地躺著晴玖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪为流。 梳的紋絲不亂的頭發(fā)上呕屎,一...
    開封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音敬察,去河邊找鬼秀睛。 笑死,一個(gè)胖子當(dāng)著我的面吹牛莲祸,可吹牛的內(nèi)容都是我干的蹂安。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼虫给,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼藤抡!你這毒婦竟也來了侠碧?” 一聲冷哼從身側(cè)響起抹估,我...
    開封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎弄兜,沒想到半個(gè)月后药蜻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡替饿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年语泽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片视卢。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡踱卵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情惋砂,我是刑警寧澤妒挎,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站西饵,受9級(jí)特大地震影響酝掩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜眷柔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一期虾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧驯嘱,春花似錦镶苞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至谢澈,卻和暖如春煌贴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背锥忿。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工牛郑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留卑惜,地道東北人平委。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像唱蒸,于是被迫代替她去往敵國(guó)和親钉答。 傳聞我的和親對(duì)象是個(gè)殘疾皇子础芍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

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

  • 協(xié)程介紹 Unity的協(xié)程系統(tǒng)是基于C#的一個(gè)簡(jiǎn)單而強(qiáng)大的接口,IEnumerator数尿,它允許你為自己的集合...
    壹米玖坤閱讀 6,268評(píng)論 0 9
  • 為什么需要協(xié)程 在游戲中有許多過程(Process)需要花費(fèi)多個(gè)邏輯幀去計(jì)算仑性。 你會(huì)遇到“密集”的流程,比如說尋路...
    tmgg閱讀 1,398評(píng)論 0 5
  • 第三篇 如何使人喜歡你 17. 學(xué)會(huì)真誠(chéng)地關(guān)心他人 我的朋友朝陽轉(zhuǎn)發(fā)的日志中有這樣一段:心右蹦,退一步是寬容诊杆;眼,讓一...
    禪園聽雪閱讀 743評(píng)論 5 15
  • 1何陆、何為第一性原理 埃隆·馬斯克不止一次的提到過晨汹,他之所以能夠在多個(gè)領(lǐng)域取得成功,來自于他對(duì)「第一原理」(Firs...
    廣逛閱讀 1,196評(píng)論 0 0
  • 這些天一直在家陪爸媽,還有就是跟好基友約飯,不知不覺國(guó)慶長(zhǎng)假就過完啦铝穷,放假前的一個(gè)重要規(guī)劃也終于完成朦乏,那就是整理我...
    帝都三腳貓閱讀 34,569評(píng)論 2 49