解决Unity2021下使用JobSystem找不到NativeList

Unity NativeList 安装使用
本文介绍如何在Unity 2021中安装并使用NativeList类。由于该类未默认包含,需要通过Package Manager搜索Collections进行安装。安装后重新生成项目即可使用NativeList。

官方一直大力推DOTS,我看JobSystem还挺好用,但发现Unity2021默认没带NativeList这个类,需要安装一个依赖包。

方法:
Windows-PackageManager,搜索Collections
在这里插入图片描述
安装之后,重新生成项目sln,这时候就可以引用NativeList了

using Unity.Collections;

NativeList<JobHandle> jobHandles = new NativeList<JobHandle>();

Unity 的 **C# Job System** 是一种用于优化性能的多线程任务处理系统,它允许开发者将计算任务分割为多个 **Job**(作业),并在多个 CPU 核心上并行执行。由于 Unity 引擎自动管理线程池和同步机制,开发者可以专注于任务逻辑的实现,而无需处理底层的线程管理[^2]。 ### 核心组件与概念 1. **Job**:Job 是一个轻量级的任务,它可以在多个线程上并行执行。Job 需要实现 `IJob` 接口或其派生接口(如 `IJobParallelFor`、`IJobParallelForTransform`)。 2. **NativeContainer**:为了确保 Job 安全地访问数据,Unity 提供了 `NativeArray<T>`、`NativeList<T>` 等原生容器,这些容器支持跨线程访问且不会产生垃圾回收(GC)负担。 3. **JobHandle**:每个提交的 Job 都会返回一个 `JobHandle` 对象,它用于跟踪 Job 的执行状态,并支持依赖链的构建,确保 Job 按照正确的顺序执行。 4. **Scheduling**:Job 的调度由 Unity 自动管理,开发者可以通过 `JobHandle` 来控制调度顺序,实现依赖关系。 ### 基本使用流程 以下是一个使用 `IJobParallelFor` 的简单示例,展示如何在多个元素上并行执行操作: ```csharp using Unity.Burst; using Unity.Jobs; using Unity.Collections; using UnityEngine; public class JobExample : MonoBehaviour { void Start() { int length = 1000; NativeArray<float> values = new NativeArray<float>(length, Allocator.TempJob); // 定义一个 Job var job = new MyJob { Values = values }; // 调度 Job JobHandle handle = job.Schedule(length, 64); // 64 为批处理大小 // 等待 Job 完成 handle.Complete(); // 读取结果 for (int i = 0; i < length; i++) { Debug.Log(values[i]); } values.Dispose(); // 释放原生容器 } [BurstCompile] struct MyJob : IJobParallelFor { public NativeArray<float> Values; public void Execute(int index) { Values[index] = Mathf.Sin(index * 0.1f); } } } ``` ### 最佳实践 1. **合理划分 Job 粒度**:Job 的粒度不宜过小,否则调度开销可能超过实际计算收益。建议将任务划分为多个中等大小的 Job,以充分利用 CPU 资源。 2. **使用 Burst 编译器**:通过 `[BurstCompile]` 属性可以显著提升 Job 的执行效率,Burst 将 C# 编译为高度优化的本地代码[^1]。 3. **避免主线程阻塞**:尽量避免频繁调用 `JobHandle.Complete()`,特别是在 Update 方法中。可以使用依赖链来异步处理多个 Job。 4. **使用 NativeContainer 管理数据**:确保所有在 Job 中访问的数据都封装在 `NativeArray`、`NativeList` 等容器中,以避免内存安全问题。 5. **控制调度频率**:对于频繁执行的小型任务,建议使用 `IJobParallelFor` 并设置合适的批处理大小(batch size),通常 32 到 1024 之间较为合适。 ### 多线程与依赖管理 Unity Job System 支持 Job 之间的依赖关系管理。例如: ```csharp JobHandle firstJobHandle = firstJob.Schedule(...); JobHandle secondJobHandle = secondJob.Schedule(..., firstJobHandle); secondJobHandle.Complete(); ``` 上述代码确保了 `secondJob` 在 `firstJob` 完成之后才开始执行。这种机制非常适用于流水线式的任务处理逻辑。 ### 性能调优建议 - **分析 Job 执行时间**:使用 Unity 的 Profiler 工具监控 Job 的执行时间,识别瓶颈。 - **减少主线程与 Job 之间的数据同步**:避免频繁地从主线程读取 Job 结果,尽可能在 Job 中完成数据处理。 - **合理使用 Allocator.TempJob**:该分配器专为 Job 设计,生命周期短,适合临时数据使用。 ### 常见问题与注意事项 - **GC 内存不能在 Job 中使用**:所有在 Job 中使用的数据结构必须为非托管类型或使用 `NativeContainer`。 - **避免竞态条件**:多个 Job 同时写入同一数据会导致未定义行为,应使用适当的同步机制或设计无共享数据的 Job。 - **注意 Job 的执行顺序**:除非显式设置依赖关系,Job 的执行顺序是不确定的。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DvLee1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值