亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#在Unity游戲開發中進行多線程編程的方法

2020-01-24 01:11:28
字體:
來源:轉載
供稿:網友

在這之前,有很多人在質疑Unity支不支持多線程,事實上Unity是支持多線程的。而提到多線程就要提到Unity非常常用的協程,然而協程并非真正的多線程。協程其實是等某個操作完成之后再執行后面的代碼,或者說是控制代碼在特定的時機執行。而多線程在Unity渲染和復雜邏輯運算時可以高效的使用多核CPU,幫助程序可以更高效的運行。本篇主要介紹在Unity中如何使用多線程。

首先引入C#中使用多線程的類庫

using System.Threading;

創建線程實例的四種方式

一、線程執行無參方法

構造語法

// 初始化 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");}

二、線程執行有參方法

構造語法

// 初始化 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);}

三、線程執行無參方法,限制線程要使用的最大堆棧大小

構造語法

// 初始化 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");}

四、線程執行有參方法,限制線程要使用的最大堆棧大小

構造語法

// 初始化 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 的調度優先級。

2016421152923973.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的使用率。通??梢詫⑿枰罅坑嬎愕乃惴▋热?,放置到多線程中執行,包括邏輯框架也可以放到多線程中執行。本篇理論性較強,后期會陸續發布實戰型文章。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人午夜小视频| 久久国产精品久久久久久久久久| 亚洲91av视频| 成人激情视频在线| 亚洲曰本av电影| 日韩av免费观影| 国产欧美婷婷中文| 欧美尤物巨大精品爽| 国产精品av电影| 久久99精品久久久久久噜噜| 欧美在线一区二区视频| 欧美极品少妇xxxxx| 91日本在线视频| 青青草原一区二区| 精品福利在线看| 亚洲国产精品电影| 欧美亚洲在线视频| 久色乳综合思思在线视频| 美乳少妇欧美精品| 538国产精品视频一区二区| 日日狠狠久久偷偷四色综合免费| 欧美日韩中文字幕在线| 欧美精品videos另类日本| 91精品国产高清久久久久久91| 中文字幕不卡在线视频极品| 亚洲自拍偷拍第一页| 国内伊人久久久久久网站视频| 色中色综合影院手机版在线观看| 色偷偷亚洲男人天堂| 国产精品一区二区久久| 精品成人av一区| 日韩中文字幕视频在线观看| 国产精品视频一| 欧美亚洲成人免费| 欧美夜福利tv在线| 久久久国产一区二区三区| 成人精品一区二区三区电影免费| 成人av.网址在线网站| 在线看片第一页欧美| 精品久久久久久久久中文字幕| 亚洲一区二区少妇| 这里只有精品在线观看| 国产一区玩具在线观看| 欧美午夜片在线免费观看| 欧美最顶级的aⅴ艳星| 69国产精品成人在线播放| 91黄色8090| 国产一区二区视频在线观看| 亚洲a成v人在线观看| 亚洲精品98久久久久久中文字幕| 欧美一性一乱一交一视频| 91精品中国老女人| 欧美激情在线视频二区| 精品毛片三在线观看| 亚洲乱码一区av黑人高潮| 国内成人精品视频| 国产精品白丝jk喷水视频一区| 日韩国产欧美精品在线| 亚洲国产精品高清久久久| 欧美日本高清视频| 91中文字幕一区| 欧美巨大黑人极品精男| 国产美女久久久| 欧美激情在线有限公司| 亚洲精品中文字幕有码专区| 91精品视频专区| 欧美极品xxxx| 日韩在线中文视频| 在线观看欧美www| 亚洲激情久久久| 国产精品一区二区在线| 亚洲国产成人精品久久久国产成人一区| 国产成一区二区| 国a精品视频大全| 国产在线久久久| 成人激情视频在线播放| 不卡av在线播放| 97国产成人精品视频| 久久久久久12| 久久影院免费观看| 在线看国产精品| 91亚洲人电影| 欧美日韩免费网站| 亚洲女在线观看| 成人中文字幕在线观看| 国产精品成人在线| 欧美一性一乱一交一视频| 欧美高清视频在线播放| 丝袜情趣国产精品| 国产成人精品日本亚洲专区61| 亚洲女人被黑人巨大进入| 日韩在线视频国产| 热久久美女精品天天吊色| 久久99国产精品久久久久久久久| 久久av红桃一区二区小说| 色综合久久中文字幕综合网小说| 国产国产精品人在线视| 欧美综合在线观看| 在线视频国产日韩| 97激碰免费视频| 在线播放国产精品| 国产亚洲欧美aaaa| 国产成人综合精品在线| 国内精品视频一区| 91免费国产网站| 色综合视频一区中文字幕| 一二美女精品欧洲| 奇米成人av国产一区二区三区| 国产精品免费小视频| 久热精品视频在线免费观看| 国产成人一区二区在线| 欧美国产日韩在线| 一本色道久久88综合亚洲精品ⅰ| 精品无码久久久久久国产| 欧美伊久线香蕉线新在线| 欧美日韩亚洲精品一区二区三区| 国产福利成人在线| 97免费视频在线播放| 亚洲视屏在线播放| 日韩经典中文字幕| 欧美一级片久久久久久久| 久久久日本电影| 国产精品网站入口| 欧美在线视频网站| 久久电影一区二区| 亚洲最大激情中文字幕| 最近2019中文免费高清视频观看www99| 亚洲天天在线日亚洲洲精| 亚洲国产精品字幕| 久久久久久一区二区三区| 亚洲男人天堂古典| 亚洲第一av在线| 91chinesevideo永久地址| 亚洲免费精彩视频| 精品调教chinesegay| 国产一区二区三区视频| 亚洲欧美综合另类中字| 国产丝袜一区视频在线观看| 日韩av电影手机在线| 日韩电影中文字幕| 在线观看久久久久久| 日韩69视频在线观看| 亚洲高清av在线| 揄拍成人国产精品视频| 欧美精品久久久久久久久| 国产精品91久久久| 欧美电影免费观看大全| 午夜精品一区二区三区在线播放| 久久91亚洲人成电影网站| 91久久久久久久久久久| 亚洲欧美中文日韩v在线观看| 国产日韩欧美夫妻视频在线观看| 国精产品一区一区三区有限在线| 欧美午夜久久久| 日韩成人在线播放| 国产精品尤物福利片在线观看| 国产区精品视频| 欧美有码在线观看视频| 欧美成人黄色小视频| 亚洲精品日韩久久久| 国产成人福利夜色影视| 午夜精品久久久久久久久久久久| 欧美国产视频一区二区| 91日本视频在线|