簡體   English   中英

等待其他功能完成時,協程是否正確?

[英]Is coroutine the right way to go, when waiting for other functions to complete?

試圖找出協程是否是正確的方法。

我有3個不同的類來執行操作。 我希望這3個類以任何順序進行工作,一旦完成這3個類,我就可以進入下一個循環並再次調用這3個類中的方法以重新開始。

像現在一樣,每個類中都有一個方法可以完成工作; 在主類中,我創建了一個協程,這是我的過程的主要循環。 協程的條件是必須完成3類中的所有3種方法,並在while循環中返回return void。 這是協程的簡化版本:

IEnumerator void loopFunction()
{
    while (!classA.method() && !classB.method() && !classC.method())
    {
        yeld return void;
    }
    // do some updates
    // start all over again
}

這將被正確實施還是我應該使用其他方法? 目的是要有一個每X秒執行一次的循環,並且僅當其中的所有方法完成時才開始一個新循環。

編輯:

瀏覽時,我發現實際上可以使用多線程,這是您的舊“ System.Threading”方式,因為Unity僅支持Net 3.5。

線程似乎是另一個可行的選擇。 盡管我聽說Unity本身不是線程安全的,但是我不確定是否可以在協程內部將不同類中的函數作為單獨的線程運行。

這取決於這些方法將如何與您的游戲其余部分進行交互。 協程提供一種並發形式,而線程提供一種並行性形式。

僅在確實需要並行化操作的情況下才使用線程,因為其余協程都很好。

協程簡單地提供了一種機制,該機制可組成獨立執行的代碼塊,其中該執行是交錯執行的,而不是並行執行的。 協程與任何其他常規方法/功能之間基本上沒有區別,只是它能夠(輕松)在特定期間中止執行。

簡而言之,協程與結構有關,線程與執行有關。 如果您只是想將一組操作分布在多個框架上,那么協程提供了一種不錯的方法。 協程在主線程上執行,因此,只要您的三個方法都在運行,游戲的其他部分將被暫停-您的代碼將控制“掛起”動作。

如果您的應用程序運行在可以並行化操作(多核或多處理器)的硬件平台上,並且您想利用這種潛力,請查看線程。 或者,如果您使用第3方庫,並且無法控制特定操作花費的時間(並且花費的時間太長),那么您也可以考慮使用線程。 顯然,這帶來了一些額外的復雜性,請記住,Unity不是線程安全的,因此,如果您的操作以任何方式與Unity API進行交互,則需要注意通過某種鎖定適當地同步您的方法。 不要直接從另一個線程訪問Unity對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM