日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

unity 下一帧执行_理解Unity中的优化(三):协程(Coroutines)

發(fā)布時(shí)間:2024/9/19 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 unity 下一帧执行_理解Unity中的优化(三):协程(Coroutines) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Coroutines:

Coroutines與其他腳本代碼的執(zhí)行方式不同。在性能分析中,大多數(shù)的腳本代碼只會(huì)在Unity的生命周期方法下出現(xiàn)一次。但是協(xié)程總是會(huì)在兩個(gè)地方出現(xiàn)。

在性能分析中,Coroutines中所有從協(xié)程開(kāi)始到第一個(gè)yield中的代碼,都會(huì)出現(xiàn)在協(xié)程出現(xiàn)的地方。通常,它會(huì)在StartCoroutine的方法中出現(xiàn)。由Unity回調(diào)產(chǎn)生的Coroutines(例如Start回調(diào)返回一個(gè)IEnumerator),首先會(huì)出現(xiàn)在各自的回調(diào)中。

協(xié)程中剩余的代碼(從第一次恢復(fù)到完成執(zhí)行),會(huì)出現(xiàn)在Unity的主循環(huán),DelayedCallManager方法中。

要理解為什么出現(xiàn)這種情況,就需要理解協(xié)程實(shí)際上是怎么執(zhí)行的:

協(xié)程運(yùn)行時(shí),C#編譯器會(huì)自動(dòng)生成一個(gè)類。這個(gè)類會(huì)在多個(gè)調(diào)用中,追蹤C(jī)oroutine的狀態(tài)。對(duì)于局部變量,由于協(xié)程中的局部變量在yield后也必須存在,所以這些局部變量會(huì)被封裝到生成類里面。在協(xié)程執(zhí)行期間,這些變量就會(huì)在托管堆中持續(xù)存在。這個(gè)對(duì)象也會(huì)追蹤協(xié)程的內(nèi)部狀態(tài):它會(huì)記錄在yield之后,協(xié)程會(huì)在什么時(shí)候繼續(xù)執(zhí)行。

正因?yàn)槿绱?#xff0c;啟動(dòng)一個(gè)coroutine的內(nèi)存開(kāi)銷等于一個(gè)固定的開(kāi)銷成本加上它的局部變量的開(kāi)銷。

開(kāi)始調(diào)用一個(gè)協(xié)程的代碼,在協(xié)程滿足yield條件時(shí),Unity會(huì)通過(guò)DelayedCallManager再次調(diào)用它們。因?yàn)閰f(xié)程有時(shí)候是被另一個(gè)協(xié)程調(diào)用的,這時(shí)候它們的開(kāi)銷就是上述兩個(gè)被拆分的開(kāi)銷。

在上述的截圖中,我們可以看到,DelayedCallManager執(zhí)行執(zhí)行了幾個(gè)協(xié)程,PopulateCharacters, AsyncLoad 和LoadDatabase。

在可能的情況下,最好在單個(gè)協(xié)程中執(zhí)行一系列的操作,雖然在代碼的清晰度和可維護(hù)方面,嵌套調(diào)用的協(xié)程比較好,但由于需要追蹤對(duì)象,嵌套調(diào)用將會(huì)花費(fèi)更高的內(nèi)存。

如果,一個(gè)協(xié)程每幀都會(huì)被執(zhí)行, 并且在長(zhǎng)時(shí)間的操作中沒(méi)有yield語(yǔ)句。那么最好把里面的代碼放到Update或者LateUpdate中。

當(dāng)一個(gè)對(duì)象被設(shè)置成disable時(shí),協(xié)程不會(huì)停止,只有當(dāng)對(duì)象被destroy時(shí),才會(huì)停止。就是說(shuō),disable一個(gè)對(duì)象時(shí),協(xié)程仍然在運(yùn)行,需要的話,可以在協(xié)程中enable這個(gè)對(duì)象。調(diào)用Destroy(this)會(huì)立即觸發(fā)OnDisable回調(diào),同時(shí),協(xié)程也會(huì)被停止。最后,在最后一幀會(huì)調(diào)用OnDestroy方法。

協(xié)程不是線程,記住這個(gè)很重要。協(xié)程中的操作依舊運(yùn)行在主線程上。如果在優(yōu)化的目標(biāo)是減少CPU在主線程上話費(fèi)的時(shí)間,那么在協(xié)程中避免出現(xiàn)一些阻塞的操作跟在其他代碼中避免出現(xiàn)一樣重要。

當(dāng)然,當(dāng)我們需要執(zhí)行一些例如Http傳輸、Asset加載或者文件I/O操作這類長(zhǎng)時(shí)間的異步操作時(shí),最好使用協(xié)程。

本文內(nèi)容來(lái)自Unity官方文檔:

Unity - Manual: Coroutines?docs.unity3d.com

作者水平有限,如有錯(cuò)誤請(qǐng)多加指正。

總結(jié)

以上是生活随笔為你收集整理的unity 下一帧执行_理解Unity中的优化(三):协程(Coroutines)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。