關於協程中yield return的一些使用

2021-08-09 20:24:24 字數 1622 閱讀 9779

1.協程與執行緒

unity中的特殊在於所有的指令碼和**都是在乙個主線程裡執行的,協程也不例外。協程與執行緒的相似點只在於,

協程看起來也可以與其他函式並行執行。 但本質上來說,執行緒

是通過可以開啟多個子執行緒同時執行程式,而達到並行。而協程則是通過每幀檢測的方式,在自己與其他函式之間切換。

2.yield return 的不同返回型別(一)

使用yield return的時候你會發現它可以返回的型別一長串,對於初學者我覺得就分為帶 new和不帶new的就行了。

先說不帶new的。通常可以yield return的有 null,數字 ,字串,布林值甚至表示式,函式,巢狀協程等。

以在start()中開啟當前協程為例,如果是不帶new的返回型別,執行時間都是一樣的。即在第一時間執行協程中的** 到第乙個yield return當行為止,然後在下一幀的update之後,lateupdate之前執行yield return後面的**。(注:本人測試用的unity版本是5.4.1,看過網上有些總結說是在lateupdate之後執行,與我測試的結果不太一樣,如果有疑問你們可以自己測試一下,因為unity中某些版本可能會做微小改動)

另外需要注意的是,yield return後面可以是乙個函式呼叫,賦值表示式,巢狀的其它協程等。以賦值的表示式num=10為例;它會在當行yield return執行的時候就執行,函式呼叫和其它協程也是一樣。也就是說,此時yield return的函式呼叫就相當於直接呼叫了這個函式,並且是當時就執行的。 而其它return 型別 如null,字串,數字等一般只用作延遲一幀來用

3.yield return 的不同返回型別(二)。

下面說帶new的,也是通常我們重點使用的協程功能。

這裡列舉幾個:

(1).new  waituntil(func)  引數是乙個布林返回型別的委託,作用是,知道這個返回的布林值為true時,協程才會繼續執行當行yield return 後面的**。       

(2) new waitforseconds(ffloat)引數是float型別的數字,表示秒,也是協程最常用的功能之一。 作用是,在n秒後才會繼續執行當行yield return 後面的**。 

由於yield return可以在乙個協程中任意位置寫多個,配合這個可以實現很多時間細化視覺化的功能。

(3)new waitforendofframe()作用是,在結束當前幀 攝像機和gui被渲染以及其它函式完成後才會繼續執行當行yield return 後面的**。 這個我只驗證了在lateupdate執行完之後執行,具體在整個指令碼週期中哪個函式執行完之後開始執行還未詳細驗證。

(4)new  waitforfixedupdate()  作用是,直到當行**之後第乙個fixedupdate執行之後才會繼續執行當行yield return 後面的**。也就是說,如果是在start裡面開啟協程的話,第一次執行fixedupdate之後就會繼續執行return後面的**。

4.停止協程

協程內停止 可以用yield return break;

協程外停止 使用 stopcoroutine(string  methodname);

另外需要注意的是,設定當前協程所在指令碼enable為false並不能停止當前協程的執行,只有設定當前指令碼掛載gameobject.setactive(false) 才可以。

關於協程 nodejs和golang協程的不同

nodejs和golang都是支援協程的,從表現上來看,nodejs對於協程的支援在於async await,golang對協程的支援在於goroutine。關於協程的話題,簡單來說,可以看作是非搶占式的輕量級執行緒。一句話概括,上面提到了 可以看作是非搶占式的輕量級執行緒 在多執行緒中,把一段 放...

協程巢狀協程

import asyncio import functools 第三層協程 async def test1 print 我是test1 await asyncio.sleep 1 print test1已經睡了1秒 await asyncio.sleep 3 print test1又睡了3秒 ret...

關於協程的 send None

這段時間太忙了,沒時間更新部落格。今天把python撿起來,看了下 協程。記錄乙個一開始沒太明白的點。直接貼 def consumer r j 0 while true n yield r 3 j j 1 print j d j if not n return print consumer cons...