Unity中的多线程
多线程测试
- 切换后台再返回,主线程和渲染线程ID均不变
- 切换后台再返回,音频线程ID会改变
多线程任务
unity中使用Job
- 效率最高,unity 专门开辟了一个线程池来执行 Job,用这个执行多线程任务效率最高
- 首先直接用线程池中的线程,省掉线程分配和释放
- 其次会根据cpu数量分配合适的线程数量,避免恶性竞争cpu,产生过多的上下文切换
- 参考 unity中使用job
unity中使用Task
参考 异步函数
unity中使用Parallel
Parallel.ForEach(_materials, material =>{
// 做点什么
});
使用Thread创建多线程
没有上面2种方案好用
线程切换
切换到主线程
-
(推荐)使用unity内置的 UnitySynchronizationContext
// 最简单的用法 public TestMultiThreadCallback() { SynchronizationContext context = SynchronizationContext.Current; CallbackFromMultiThread(()=>{ context.Post(()=>{ // 回到主线程 }); }); } // 封装成工具类 public static class ThreadUtil { // 让代码在unity主线程运行 // 使用 UnitySynchronizationContext.Send 如果当前是主线程则直接运行, // 否则加入队列,阻塞当前线程,等待任务完成,谨慎使用,容易造成死锁 // 比如 android 的java端在 UnityActivity.onResume 时调用c#代码, // 然后c#调用 Send 往主线程加任务就会死锁,因为 java 线程被阻塞等待 c# 任务完成 // 而unity等待java线程调用 onResume 才能让unity线程继续执行 // 使用 UnitySynchronizationContext.Post 直接加入队列,当前线程继续执行