用多线程统一做一些事情是非常好的,比如解压资源,更新资源等等。因为单独开线程的话,不会影响主线程卡死,这样UI就不会卡了。 但是unity主线程的mono代码是不能在开启的线程中执行的。 线程启动后,线程执行完会自动终止,可以启动多个线程同时做事情。
代码如下:
using System.Threading; void StartThread() { Thread athread = new Thread(new ThreadStart(goThread)); athread.IsBackground = true;//防止后台现成。相反需要后台线程就设为false athread.Start(); } void Awake() { StartThread(); } object lockd = new object(); void goThread() { int index = 0; while (true) { lock (lockd)//防止其他线程访问当前线程使用的数据 { Debug.Log("in thread" + index); index++; if (index == 100) { Thread.Sleep(10000);// 将当前线程挂起指定的时间 毫秒 时间结束后 继续执行下一步 和yield类似 } else if (index == 200) { break;//该函数执行完自动结束该线程 } } } }
所以其实多线程和协程的原理是有很大区别的,但是功能有些相似。
1、在主线程中创建线程时橙光游戏UI界面,线程的IsBackground默认设置为FALSE。
2、当主线程退出时,IsBackground=FALSE的线程会继续执行,直到线程执行结束。
3.只有IsBackground=TRUE的线程才会随着主线程的退出而退出
线程启动:
线程 athread = new Thread(new ThreadStart(goThread));
athread.Start();//该方法启动的多线程不能带参数。
参数ThreadStart:
ParameterThreadStart 定义为 void ParameterizedThreadStart(object state)。 这个委托定义的线程的启动函数可以接受一个输入参数。 具体例子如下:
ParameterizedThreadStart threadStart=new ParameterizedThreadStart(Calculate) Thread thread=new Thread(threadStart) thread.Start(0.9);//参数是0.9 public void Calculate(object arg)//arg参数是0.9 { double Diameter=double(arg); Console.Write("The Area Of Circle with a Diameter of {0} is {1}"Diameter,Diameter*Math.PI); }Calculate 方法只有一个对象类型的参数。 当需要传递多个参数时,需要将所有的参数都塞进对象中,然后再进行转换。 例如:
参数 void BuildA(object para){ List list=para as List;...}
构建A(列表);
多参数 void BuildB(object para){ object[] ps= para as object[];List list=ps[0] as as List;GameObject b=ps[1] as GameObject;……}
BuildB(new object[]{list,obj});//将多个参数放入对象数组中并传递unity 线程 挂起unity 线程 挂起,相当于只传递一个参数。
至于开单线程还是多线程,根据需求和SystemInfo.processorCount的核心数来决定。 最好每个核心开一个线程,速度会更快。
有关详细信息,请参阅 bundleglobal.cs 和 sdFileSystem.cs/sdMultiThread.cs
读写多线程最好的办法就是开多个线程读取保存到一个临时的地方再开一个线程保存,不然多个线程同时读写肯定会冲突。
一篇关于C#线程解释的好文章:
从: