C#在Unity游戏开发中进行多线程编程的方法
在这之前,有很多人在质疑Unity支不支持多线程,事实上Unity是支持多线程的。而提到多线程就要提到Unity非常常用的协程,然而协程并非真正的多线程。协程其实是等某个操作完成之后再执行后面的代码,或者说是控制代码在特定的时机执行。而多线程在Unity渲染和复杂逻辑运算时可以高效的使用多核CPU,帮助程序可以更高效的运行。本篇主要介绍在Unity中如何使用多线程。 首先引入C#中使用多线程的类库 using System.Threading; 创建线程实例的四种方式 一、线程执行无参方法 构造语法 // 初始化 Thread 类的新实例。 // < param name="start">无参委托对象.</ param> public Thread(ThreadStart start) start 类型:System.Threading.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 实例 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 maxStackSize 类型:System.Int32 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 maxStackSize 类型:System.Int32 实例 void Start() { //创建有参线程对象,限制256KB堆栈大小 Thread thr = new Thread(Func_Arguments,262144); //启动线程,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); //启动线程,Data = " + data); }
常用方法 1.public static void Sleep( int millisecondsTimeout)将当前线程挂起指定的毫秒数。 通过线程池执行线程 2.ThreadPool.QueueUserWorkItem 方法 (WaitCallback) 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的使用率。通常可以将需要大量计算的算法内容,放置到多线程中执行,包括逻辑框架也可以放到多线程中执行。本篇理论性较强,后期会陆续发布实战型文章。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |