unity中使用Job

Unity的Job系统通过线程池提高执行效率,避免线程分配和释放的开销,并根据CPU数量智能调度线程,减少上下文切换。适合场景包括:单一任务推荐使用异步以不在主线程执行,多个任务的并行处理则应使用异步以避免主线程负载过高。
摘要由CSDN通过智能技术生成

unity中使用Job

  • 效率最高,unity 专门开辟了一个线程池来执行 Job,用这个执行多线程任务效率最高

    • 首先直接用线程池中的线程,省掉线程分配和释放
    • 其次会根据cpu数量分配合适的线程数量,避免恶性竞争cpu,产生过多的上下文切换
  • 应用场景

    • 1个任务,只能用异步
      用同步会在主线程执行,不会提升效率
    • 1个任务同时依赖其它多个任务,可以用异步或同步
      不管用同步或异步都会在其它线程执行
    • 1个并行任务,可以用异步或同步,如果任务重,照样会卡,此时只能用异步
      用同步会给主线程也分配任务,用异步不会给主线程分配任务
  • 普通作业

    	//	定义作业,就是定义实现 IJob 的结构体
    	//	必须是结构体,因为要进行克隆操作
    	public struct MyJob : IJob
    	{
         
    		//	成员变量,只能是 blittable 类型,就是常用的可直接跟C通信的值类型
    		//		和 NativeContainer 类型,比如 NativeArray NativeSlice NativeList NativeQueue 等
    		//		NativeContainer 类型其实就是c内存的c#包装类
    		//	因为在别的线程实际上是复制了一个结构体过去执行时,因此值类型成员其实是拷贝了一份
    		//		只有 NativeContainer 成员指向的内存是相同的,因此返回值必须放在 NativeContainer 内
    
            [ReadOnly]      //  只读,一般用于输入参数
            [DeallocateOnJobCompletion]     //  任务完成自动调用 Dispose
            public NativeArray<float> data;
    		public float a;
    		public float b;
            [WriteOnly]     //  只写,一般用于返回值
    		public NativeArray<float> result;
    
    		//	实现 Execute 函数
    		//	MyJob 实例将被复制一份在多线程中执行
    		//	因此 MyJob 必须是结构体
    		public void Execute()
    		{
         
    			Debug.Log($"Execute ThreadId={
           Thread.CurrentThread.ManagedThreadId}");
    			result[0] = a + b;
    		}
    	}
    
    	public class TestJob
    	{
         
    		//	创建作业
    		private static MyJob CreateJob()
    		{
         
    			MyJob jobData = new MyJob();
    			jobData.a = 10;
    			jobData.b = 10;
    			jobData.result = new NativeArray<float>(1, Allocator.TempJob);  //	必须用 Allocator.TempJob 或 Allocator.Persistent
    
    			return jobData;
    		}
    
    		private static void ReleaseJob(MyJob job)
    		{
         
    			
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值