unity中使用Job

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

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)
    		{
         
         
    			
<think>好的,我现在需要帮助用户了解如何在Unity使用AnimationStream。首先,我需要回忆一下关于AnimationStream的知识,以及它在Unity中的具体应用场景。根据用户提供的引用内容,特别是引用[2],里面提到PropertyStreamHandle可以绑定到动画曲线、组件属性和自定义属性,并通过AnimationStream读写这些属性值。支持的类型包括float、int和bool,并且绑定的Component必须是Animator所在的GameObject的子节点。 首先,我应该解释AnimationStream的基本概念,说明它是用于在动画系统中处理数据流的。然后,可能需要分步骤说明如何使用,比如如何获取AnimationStream,如何绑定属性,如何读取和写入值。需要结合代码示例,这样用户更容易理解。 用户可能对具体的操作步骤不太清楚,比如如何创建PropertyStreamHandle,如何绑定到属性,以及如何在动画播放时修改这些属性。因此,我需要提供一个简单的教程,分步骤引导用户。同时,要注意代码的正确性,确保语法正确,并符合Unity的API使用规范。 另外,根据引用[2]中的注意事项,需要提醒用户关于Component的层级关系,确保绑定的对象是正确的子节点,避免常见的错误。可能还需要提到使用AnimationStream的上下文,比如在Playable Graphs中的使用,或者与Animator Controller的配合。 还需要考虑用户可能的进阶需求,比如性能优化、使用场景举例,或者与其他系统(如状态机、事件系统)的集成。这部分可以通过相关问题来引导用户进一步探索。 现在,我需要整理这些思路,按照用户的要求,用中文分步骤说明,确保结构清晰,并包含代码示例。同时,生成相关问题,帮助用户深入理解。</think>在Unity使用$AnimationStream$需要结合动画系统和Playable API进行操作,主要应用于动态修改动画属性或创建自定义动画逻辑。以下是具体实现步骤和示例: ### 一、基础使用方法 1. **创建属性句柄** 使用$PropertyStreamHandle$绑定目标属性: ```csharp using UnityEngine.Animations; public class AnimationStreamExample : MonoBehaviour { private PropertyStreamHandle floatHandle; private Animator animator; void Start() { animator = GetComponent<Animator>(); // 绑定到Animator所在GameObject的某个子对象属性 floatHandle = animator.BindStreamProperty(transform.Find("TargetObject"), typeof(Transform), "localPosition.x"); } } ``` 2. **读写动画流数据** 在动画更新周期内操作数据: ```csharp void OnAnimatorMove() { var stream = animator.openAnimationStream(); // 读取当前值 float currentX = floatHandle.GetFloat(stream); // 修改值并写回 floatHandle.SetFloat(stream, currentX + 0.1f); stream.closeAnimationStream(); } ``` ### 二、高级应用场景 #### 动态混合动画参数 ```csharp AnimationScriptPlayable.Create(graph, new YourCustomJob()); // 自定义Job结构体 struct YourCustomJob : IAnimationJob { public PropertyStreamHandle targetProperty; public void ProcessAnimation(AnimationStream stream) { float value = targetProperty.GetFloat(stream); targetProperty.SetFloat(stream, Mathf.Sin(Time.time) * value); } } ``` ### 三、关键注意事项 1. **层级约束** 绑定的组件必须是Animator所在GameObject的**直接或间接子节点**,否则会抛出异常[^2] 2. **性能优化** - 尽量在初始化阶段完成句柄绑定 - 避免每帧创建/销毁$AnimationStream$ - 使用$AnimationScriptPlayable$实现批量处理
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值