1. 程式人生 > >關於Unity中協程、多線程、www網絡類的使用

關於Unity中協程、多線程、www網絡類的使用

方式 star called image {} 線程安全 sin object generic

協程

我們要下載一張圖片,加載一個資源,這個時候一定不是一下子就加載好的,或者說我們不一定要等它下載好了才進行其他操作,如果那樣的話我就就卡在了下載圖片那個地方,傻住了。我們希望我們只要一啟動加載的命令,回來的時候主線程能夠繼續進行下去。

我們可以啟動一個協程去下載,主進程依然在運行。有點類似多線程,不同的是,實際上它還是在一個線程裏面,所以我們是在主線程中開啟一段邏輯來進行處理,來協同當前程序的執行,還是在主線程裏面。

1:在主進程中開啟另外一段邏輯處理,來協同當前程序的執行,但與多線程不同都是在主線程裏面執行的,而且原來的進程依然進行下去,

2:通過StartCoroutine方法來啟動一個協程,StartCoroutine是MonoBehaviour的一個方法,該方法可以啟動一個協程,每個協程都有一個入口函數,協程必須要是一個IEnumerator 作為返回值的方法(入口函數);

3:協同程序可以使用yield 關鍵字來中斷協同程序;

4:協程也可以啟動一個協程;

5:WaitForSeconds(): 等待多長時間後中斷協程;

協程實例

1.創建Unity項目和文件目錄,保存場景

2.創建一個空節點game,再創建一個腳本game掛載在gamej節點下

 打開game腳本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class game : MonoBehaviour {

    private int level=3;
    
// Use this for initialization void Start () { //啟動一個協程,必須是繼承自MonoBehaviour才能使用 this.StartCoroutine(this.con_entry()); //主線程依然在執行 //... } //協程和主線程是在同一個線程裏面的,不會有什麽線程切換 //協程的入口函數 IEnumerator con_entry(){ //協程的代碼 Debug.Log("con_entry run!!
"); Debug.Log("level:" + this.level);//也能夠拿到this的變量 this.StartCoroutine(this.con_other());//再開啟一個協程con_other //end //使用yield中斷協程程序,就是讓它停下來 yield return null; //協程結束以後的代碼,比如去網上撈一個什麽東西,下載圖片之類的,撈完之後的操作 //end } IEnumerator con_other() { Debug.Log("con_other"); this.StartCoroutine(this.con_entry_params(3));//再開啟一個協程con_entry_params,且傳遞參數 yield return null; } IEnumerator con_entry_params(int a) { Debug.Log("con_entry_params: " + a); yield return new WaitForSeconds(3);//設置3秒中之後才中斷協程 Debug.Log("after WaitForSeconds send");// 處理協程結束的邏輯 } // Update is called once per frame void Update () { } }

多線程

1: using System.Thread;

2: 創建一個線程: Thread r = new Thread(callback); r.start(); 啟動運行線程;

3: 線程回掉函數 void run() {}

4: 多個線程訪問同一個數據的時候,會發生”沖突”,需要線程安全的方式來訪問;

5: 線程鎖是在訪問公共數據的時候,先去獲得這個鎖,沒有獲得鎖的線程將會被掛起,指導這個鎖被釋放。

6: public static Object o = new Object(); lock(o) {線程安全的執行代碼};

7: 線程休眠: Thread.Sleep(單位為ms);

8: 多線程之間要避免死鎖;

技術分享

關於Unity中協程、多線程、www網絡類的使用