程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#在Unity游戲開辟中停止多線程編程的辦法

C#在Unity游戲開辟中停止多線程編程的辦法

編輯:C#入門知識

C#在Unity游戲開辟中停止多線程編程的辦法。本站提示廣大學習愛好者:(C#在Unity游戲開辟中停止多線程編程的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是C#在Unity游戲開辟中停止多線程編程的辦法正文


在這之前,有許多人在質疑Unity支不支撐多線程,現實上Unity是支撐多線程的。而提到多線程就要提到Unity異常經常使用的協程,但是協程並不是真實的多線程。協程實際上是等某個操作完成以後再履行前面的代碼,或許說是掌握代碼在特定的機會履行。而多線程在Unity襯著和龐雜邏輯運算時可以高效的應用多核CPU,贊助法式可以更高效的運轉。本篇重要引見在Unity中若何應用多線程。

起首引入C#中應用多線程的類庫

using System.Threading;

創立線程實例的四種方法

1、線程履行無參辦法

結構語法

// 初始化 Thread 類的新實例。
// < param name="start">無參拜托對象.</ param>
public Thread(ThreadStart start)

start

類型:System.Threading.ThreadStart
表現開端履行此線程時要挪用的辦法的 ThreadStart 拜托。

void Start()
{
 //創立無參線程對象
 Thread thr = new Thread(Func_NoArguments);
 //啟動線程
 thr.Start();
}
// Function Of No Arguments.

void Func_NoArguments()
{
 Debug.Log("Run Func_NoArguments");
}

2、線程履行有參辦法

結構語法

// 初始化 Thread 類的新實例。
// < param name="start">有參拜托對象.< /param>
public Thread(ParameterizedThreadStart start)

start

類型:System.Threading.ParameterizedThreadStart
一個拜托,它表現此線程開端履行時要挪用的辦法。
留意:參數只能有一個,且必需為object類型

實例

void Start()
{
 //創立有參線程對象
 Thread thr = new Thread(Func_Arguments);
 //啟動線程,傳入參數
 thr.Start("Lanou");
}
// Function Of Have Arguments.
void Func_Arguments(object data)
{
 Debug.Log("Run Func_Arguments, Data = " + data);
}

3、線程履行無參辦法,限制線程要應用的最年夜客棧年夜小

結構語法

// 初始化 Thread 類的新實例。
// < param name="start">無參拜托對象.< /param>
// < param name="maxStackSize">應用的最年夜客棧年夜小.< /param>
public Thread(ThreadStart start,int maxStackSize)

start

類型:System.Threading.ThreadStart
表現開端履行此線程時要挪用的辦法的 ThreadStart 拜托。

maxStackSize

類型:System.Int32
線程要應用的最年夜客棧年夜小(以字節為單元);假如為 0,則應用可履行文件的文件頭中指定的默許最年夜客棧年夜小。
主要事項:關於部門受信賴的代碼,假如 maxStackSize 年夜於默許客棧年夜小,則將其疏忽。 不激發異常。

void Start()
{
 //創立無參線程對象,限制256KB客棧年夜小
 Thread thr = new Thread(Func_NoArguments,262144);
 //啟動線程
 thr.Start();
}
// Function Of No Arguments.
void Func_NoArguments()
{
 Debug.Log("Run Func_NoArguments");
}

4、線程履行有參辦法,限制線程要應用的最年夜客棧年夜小

結構語法

// 初始化 Thread 類的新實例。
// < param name="start">有參拜托對象.< /param>
// < param name="maxStackSize">應用的最年夜客棧年夜小.< /param>
public Thread(ParameterizedThreadStart start,int maxStackSize)

start

類型:System.Threading.ParameterizedThreadStart
一個拜托,它表現此線程開端履行時要挪用的辦法。
留意:參數只能有一個,且必需為object類型

maxStackSize

類型:System.Int32
線程要應用的最年夜客棧年夜小(以字節為單元);假如為 0,則應用可履行文件的文件頭中指定的默許最年夜客棧年夜小。
主要事項:關於部門受信賴的代碼,假如 maxStackSize 年夜於默許客棧年夜小,則將其疏忽。 不激發異常。

實例

void Start()
{
 //創立有參線程對象,限制256KB客棧年夜小
 Thread thr = new Thread(Func_Arguments,262144);
 //啟動線程,傳入參數
 thr.Start("Lanou");
}
// Function Of Have Arguments.
void Func_Arguments(object data)
{
 Debug.Log("Run Func_Arguments, Data = " + data);
}

啟動線程(上文已應用)

無參啟動

void Start()
{
 //創立無參線程對象
 Thread thr = new Thread(Func_NoArguments);
 //啟動線程
 thr.Start();
}
// Function Of No Arguments.
void Func_NoArguments()
{
 Debug.Log("Run Func_NoArguments");
}

有參啟動

void Start()
{
 //創立有參線程對象
 Thread thr = new Thread(Func_Arguments);
 //啟動線程,傳入參數
 thr.Start("Lanou");
}
// Function Of Have Arguments.
void Func_Arguments(object data)
{
 Debug.Log("Run Func_Arguments, Data = " + data);
}


經常使用辦法

1.public static void Sleep( int millisecondsTimeout)將以後線程掛起指定的毫秒數。
(1)millisecondsTimeout
類型:System.Int32
掛起線程的毫秒數。 假如 millisecondsTimeout 參數的值為零,則該線程會將當時間片的殘剩部門讓給任何曾經預備好運轉的、有一致優先級的線程。 假如沒有其他曾經預備好運轉的、具有一致優先級的線程,則不會掛起以後線程的履行。
(2)public void Resume()
持續已掛起的線程。(已過時)
(3)public void Abort()
在挪用此辦法的線程上激發 ThreadAbortException,以開端終止此線程的進程。 挪用此辦法平日會終止線程。
(4)public void Join()
阻攔挪用線程直到線程終止,同時持續履行尺度的 COM 和 SendMessage 傳送。
(5)public enum ThreadPriority
指定 Thread 的調劑優先級。

https://www.aspphp.online/bianchen/UploadFiles_4619/201707/2017072810373125.png (1248×630)

經由過程線程池履行線程

2.ThreadPool.QueueUserWorkItem 辦法 (WaitCallback)
public static bool QueueUserWorkItem(WaitCallback callBack)
callBack
類型:System.Threading.WaitCallback
一個 WaitCallback,表現要履行的辦法。
前往值
類型:System.Boolean
假如此辦法勝利列隊,則為 true;假如沒法將該任務項列隊,則激發 NotSupportedException。

Unity應用多線程留意

變量都是同享的(都能指向雷同的內存地址)
UnityEngine的API不克不及在分線程運轉
UnityEngine界說的根本構造(int,float,Struct界說的數據類型)可以在分線程盤算,如 Vector3(Struct)可以 , 但Texture2d(class,根父類為Object)弗成以。
UnityEngine界說的根本類型的函數可以在分線程運轉
Unity多線程插件

LOOM Multi Threading Framework 1.7 

焦點辦法

// Unlike "StartMultithreadedWorkloadExecution", you will have to build your own IThreadWorkerObject.
 // Downside: It requires some extra work. Upside: you got more controll over what goes in and comes out
 // Infact: You can create you own polymorphed IThreadWorkerObject-array, each ellement being a completely different type. For example: the statemachines of enemies are IThreadWorkerObject's and the array contains completely different classes with enemies/AI-behaviours.
 // < param name="workerObjects">An array of IThreadWorkerObject objects to be handled by the threads. If you want multiple cores/threads to be active, make sure that the number of IThreadWorkerObject's proves matches/exeeds your preferred number maxWorkingThreads. < /param>
 // < param name="onComplete">Fired when all re-packaged workLoad-objects are finished computing< /param>
 // < param name="onPackageExecuted">Fires foreach finished re-packaged set of workLoad-object< /param>
 // < param name="maxThreads"> Lets you choose how many threads will be run simultaneously by the threadpool. Default: -1 == number of cores minus one, to make sure the MainThread has at least one core to run on. (quadcore == 1 core Mainthread, 3 cores used by the ThreadPoolScheduler)< /param>
 // < param name="scheduler">If Null, a new ThreadPoolScheduler will be instantiated.< /param>
 // < param name="safeMode">Executes all the computations within try-catch events, logging it the message + stacktrace< /param>
 // < returns>A ThreadPoolScheduler that handles all the repackaged workLoad-Objects< /returns>
 public static ThreadPoolScheduler StartMultithreadedWorkerObjects(IThreadWorkerObject[] workerObjects, ThreadPoolSchedulerEvent onCompleteCallBack, ThreadedWorkCompleteEvent onPackageExecuted = null, int maxThreads = -1, ThreadPoolScheduler scheduler = null, bool safeMode = true)
{
  if (scheduler == null)
  scheduler = CreateThreadPoolScheduler();

 scheduler.StartASyncThreads(workerObjects, onCompleteCallBack, onPackageExecuted, maxThreads, safeMode);
 return scheduler;
}


停止語

Unity可使用多線程,但對其有許多限制,所以在不應用UnityEngine API的情形下,可使用多線程,進步多核CPU的應用率。平日可以將須要年夜量盤算的算法內容,放置到多線程中履行,包含邏輯框架也能夠放到多線程中履行。本篇實際性較強,前期會陸續宣布實戰型文章。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved