異步
C# 異步
因為同步行程會出現阻塞的情況,為了避免卡頓,以及在處理資料時仍然可以接收用戶新的訪問,異步的思想就出現了
異步可以理解為,在呼叫異步函式的時候,函式會直接回傳,然后剩下的部分等同于在一個新執行緒中運行
異步操作的關鍵字是asnyc,await,當一個方法具有 async 的簽名時, 它會向編譯器發出信號,說明此方法包含 await 陳述句;也包含異步操作,
windows官方定義:
異步操作后跟同步操作的這種組合是一個異步操作, 換言之,如果操作的任何部分是異步的,整個操作就是異步的,
Unity 異步
Unity還提供了一系列的異步操作,方便大家根據需要進行選擇,這些異步操作包括Resources的加載、場景的加載、Asset Bundle的加載、NavMesh的生成等等,當然,這些異步操作的底層實作各不相同,有些是獨立執行緒處理的,有些則是利用Unity內部的JobSystem,也有一些是二者結合使用的,
在Unity中使用協程搭配異步來寫代碼更佳,例如通過異步加載場景,在加載程序中通過每幀更新進度條給予玩家一個反饋,就可以在協程中呼叫異步加載場景的方法,然后暫停協程,等待當前一幀結束,然后更新進度條,反復之后,就完成進度條顯示進度加載場景的效果,
這里有四點需要注意:
- 首先創建一個unity自定義
AsyncOperation類的物件,來承接unity異步加載場景的回傳值,這里的回傳值就是剛才的那個AsyncOperation類,作用是管理異步加載的進度,以及操控加載完畢后場景是否顯示- 通過
yield return new WaitForEndOfFrame()達到協程的一個暫停,不然很快進度條就跑過去了,可能這個時候場景資料還沒有加載完- 異步加載場景函式呼叫一次就好,呼叫多次的話,出現bug先不說,如果所要加載的場景特別大的話,估計CPU就報廢了(開個玩笑),所以在呼叫完異步之后,要做一個標記,回圈再進來之后不進入異步的陳述句
- 因為加載場景,有可能在進度潭訓沒有走完之前,場景就加載好了,所以要保證場景加載完畢之后場景不顯示,需要用到
ao.allowSceneActivation = false;陳述句,當然,在進度條加載完成之后,呼叫ao.allowSceneActivation = false;陳述句顯示所加載的場景
代碼如下:
public class Loading : MonoBehaviour
{
public string sceneName;
private Text text_LoadProgress;
private AsyncOperation ao;
private bool isLoad = false;
private void Awake()
{
text_LoadProgress = GetComponent<Text>();
EventCenter.AddListener(EventDefine.startLoadScene, StartLoad);
gameObject.SetActive(false);
}
private void OnDestroy()
{
EventCenter.RemoveListener(EventDefine.startLoadScene, StartLoad);
}
private void StartLoad()
{
gameObject.SetActive(true);
StartCoroutine("Load");
}
public IEnumerator Load()
{
int displayProgress = -1;
int toProgress = 100;
while (displayProgress < toProgress)
{
++displayProgress;
ShowProgress(displayProgress);
if(!isLoad)
{
ao = SceneManager.LoadSceneAsync(sceneName);
ao.allowSceneActivation = false;
isLoad = true;
}
yield return new WaitForEndOfFrame();
}
if(displayProgress == 100)
{
ao.allowSceneActivation = true;
StopCoroutine("Load");
}
}
private void ShowProgress(int progress)
{
text_LoadProgress.text = progress.ToString() + "%";
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/300823.html
標籤:其他
上一篇:用c語言實作三子棋小游戲
下一篇:Unity 性能優化方法總結
