1. 程式人生 > >瞭解UNITY中的多執行緒及使用多執行緒

瞭解UNITY中的多執行緒及使用多執行緒

有些不涉及U3D API的計算可以放在分執行緒裡,能提高多核CPU的使用率。 總結: 0. 變數(都能指向相同的記憶體地址)都是共享的 1. 不是UnityEngine的API能在分執行緒執行 2. UnityEngine定義的基本結構(int,float,Struct定義的資料型別)可以在分執行緒計算  如 Vector3(Struct)可以 , 但Texture2d(class,根父類為Object)不可以。 3 UnityEngine定義的基本型別的函式可以在分執行緒執行,如
  1. int i = 99;
  2. print (i.ToString());
  1. Vector3 x = new Vector3(0,0,9);
  2. x.Normalize();

類的函式不能在分執行緒執行

obj.name  實際是get_name函式 分執行緒報錯誤:get_name  can only be called from the main thread.

Texture2D tt = new Texture2D(10,10);

實際會呼叫UnityEngine裡的Internal_Create

分執行緒報錯誤:Internal_Create  can only be called from the main thread.

其他transform.position,Texture.Apply()等等都不能在分執行緒裡執行。 結論: 分執行緒可以做 基本型別的計算, 以及非Unity(包括.Net及SDK)的API  例1:在分執行緒裡print資訊
  1. using UnityEngine;
  2. using System.Collections;
  3. using System;
  4. using System.Threading;
  5. public class Manager : MonoBehaviour {
  6. void Start () {
  7. Thread t = new Thread(new ThreadStart(Cal));
  8. t.Start();
  9. }
  10. void Cal()
  11. {
  12. print ("Hello world!");
  13. }
  14. }
執行後在控制檯裡會輸出’Hello world!‘ 例2:基本的計算
  1. using UnityEngine;
  2. using System.Collections;
  3. using System;
  4. using System.Threading;
  5. public class Manager : MonoBehaviour {
  6. public int index;
  7. void Start () {
  8. index = 0;
  9. Thread t = new Thread(new ThreadStart(Cal));
  10. t.Start();
  11. }
  12. void Update () {
  13. print("index: "+index);
  14. }
  15. void Cal()
  16. {
  17. index = 10;
  18. }
  19. }

例3:計算Vector3

  1. using UnityEngine;
  2. using System.Collections;
  3. using System;
  4. using System.Threading;
  5. public class Manager : MonoBehaviour {
  6. public Vector3 vec;
  7. void Start () {
  8. vec = new Vector3(0,0,0);
  9. Thread t = new Thread(new ThreadStart(Cal));
  10. t.Start();
  11. }
  12. void Update () {
  13. print(vec);
  14. }
  15. void Cal()
  16. {
  17. vec = new Vector3(10,20,0);
  18. }
  19. }
例4 在分執行緒裡建立並計算Vector3
  1. using UnityEngine;
  2. using System.Collections;
  3. using System;
  4. using System.Threading;
  5. public class Manager : MonoBehaviour {
  6. public Texture2D t2d;
  7. void Start () {
  8. Thread t = new Thread(new ThreadStart(Cal));
  9. t.Start();
  10. }
  11. void Cal()
  12. {
  13. Vector3 x = new Vector3(0,0,9);
  14. print(x);
  15. }
  16. }
例5 在分執行緒裡建立並呼叫Vector3的函式
  1. using UnityEngine;
  2. using System.Collections;
  3. using System;
  4. using System.Threading;
  5. public class Manager : MonoBehaviour {
  6. public Texture2D t2d;
  7. void Start () {
  8. Thread t = new Thread(new ThreadStart(Cal));
  9. t.Start();
  10. }
  11. void Cal()
  12. {
  13. Vector3 x = new Vector3(0,0,9);
  14. x.Normalize();
  15. print(x);
  16. }
  17. }
輸出(0.0, 0.0, 1.0) 多執行緒還可以用來Socket傳輸資料