Administrator
发布于 2025-05-16 / 7 阅读
0

Unity JobSystem 使用教程

Unity 的 Job System 是一种多线程编程框架,可以显著提高 CPU 性能,适用于大量数据的并行处理场景,比如 AI、物理模拟、粒子系统等。下面是一份详细的新手向教程,帮助你从 0 上手 Unity Job System。


✅ 一、什么是 Unity Job System?

  • Unity 的 Job System 是基于 C# 的 轻量级多线程系统,让你写出高性能的并行代码。

  • 它与 Burst CompilerECS (Entity Component System) 密切相关,但 Job System 也可以单独使用。


✅ 二、使用 Job System 的基本流程

  1. 定义一个 IJob 结构体(或其他 Job 接口)。

  2. 实现 Job 的 Execute() 方法。

  3. 创建 Job 实例并调用 Schedule()

  4. 调用 jobHandle.Complete() 等待 Job 执行完成。


✅ 三、基础示例:让一个数组的每个元素乘 2

🔧 1. 引入命名空间

using Unity.Burst;
using Unity.Collections;
using Unity.Jobs;
using UnityEngine;

🔧 2. 编写 Job 结构体

[BurstCompile] // 可选:使用 Burst 编译器优化性能
public struct MultiplyJob : IJob
{
    public NativeArray<int> numbers;

    public void Execute()
    {
        for (int i = 0; i < numbers.Length; i++)
        {
            numbers[i] *= 2;
        }
    }
}

🔧 3. 调用 Job 执行

public class JobExample : MonoBehaviour
{
    private NativeArray<int> numbers;

    void Start()
    {
        numbers = new NativeArray<int>(5, Allocator.TempJob);
        for (int i = 0; i < numbers.Length; i++)
            numbers[i] = i + 1;

        MultiplyJob job = new MultiplyJob { numbers = numbers };
        JobHandle handle = job.Schedule();
        handle.Complete();

        for (int i = 0; i < numbers.Length; i++)
            Debug.Log(numbers[i]); // 输出:2 4 6 8 10

        numbers.Dispose();
    }
}

✅ 四、使用 IJobParallelFor 进行并行运算

用于大数据数组时推荐使用 IJobParallelFor,自动并发处理每个索引。

[BurstCompile]
public struct MultiplyParallelJob : IJobParallelFor
{
    public NativeArray<int> numbers;

    public void Execute(int index)
    {
        numbers[index] *= 2;
    }
}

public class ParallelJobExample : MonoBehaviour
{
    NativeArray<int> numbers;

    void Start()
    {
        numbers = new NativeArray<int>(100, Allocator.TempJob);
        for (int i = 0; i < numbers.Length; i++) numbers[i] = i;

        MultiplyParallelJob job = new MultiplyParallelJob { numbers = numbers };
        JobHandle handle = job.Schedule(numbers.Length, 16); // 16: batch size
        handle.Complete();

        Debug.Log(numbers[10]); // 示例
        numbers.Dispose();
    }
}

✅ 五、Job 类型对比

接口

描述

IJob

单线程 Job

IJobParallelFor

多线程,适用于数组等数据

IJobParallelForTransform

并行操作 Transform(需配合 DOTS)

IJobChunk

ECS 专用 Job


✅ 六、注意事项

  • NativeArray 一定要 Dispose()

  • Job 是“值类型”,不支持引用类型(class)。

  • Job 不能访问 UnityEngine 的 API(如 transform.position),因为它不是线程安全的。

  • Job 必须在主线程上 Schedule(),不可在其他线程中调度。

  • 多 Job 可以用 JobHandle.CombineDependencies() 合并。


✅ 七、进阶建议

功能

推荐资源

性能进一步优化

使用 BurstCompiler

更复杂的数据结构

使用 NativeSlice, NativeList

更高级并发控制

使用 JobHandle.CombineDependencies()

与 ECS 联用

了解 Unity DOTS(Data-Oriented Tech Stack)


✅ 八、官方资源推荐


是否需要我:

  • ✅ 提供一个完整可运行的 Job System 示例工程?

  • ✅ 生成一个图示流程图帮你理解 Job 生命周期?

  • ✅ 帮你把项目中的代码改造成 Job System 版本?

欢迎继续提问!