Unity多线程学习笔记

Unity自带有个玩意叫IJob允许多线程
using Unity.Jobs;
提升效率贼高
加上Unity的Burst效率更高但是麻烦1000倍,Burst会把C#代码编译成机器语言原子操作。下个文章写Burst。
Execute方法里就是多线程执行的测试内容

public struct Job : IJob
{
    //效率测试
    public void Execute()
    {
        for (int i = 0; i < 1000000; i++)
        {
           float b = i / (i / 3f) % (i / 4f);
        }
    }
}

最开始不晓得效率和正常运行有啥差别,应为我是直接

        new Job().Schedule().Complete();

Schedule是运行Complete是结束。
这么搞完全不行,相当于和直接在主线程运行一样。
因为Complete会等待其他线程这一帧运行完毕。
咱主线程这一帧比其他线程快得多,所以咱得等别的线程运行一会儿再Complete。

现在这么搞

public class JobManager : MonoBehaviour
{

    JobHandle[] handles = new JobHandle[8];
    int i;
    void Start()
    {
        for (int i = 0; i < handles.Length; i++)
        {
            handles[i] = new Job().Schedule();
        }
    }
    private void Update()
    {
        handles[i].Complete();
        handles[i++] = new Job().Schedule();
        if (i == handles.Length) i = 0;
    }
}

相当于是开八个子线程
每个子线程这一帧运行主线程的八帧时长再Complete。
这样效率咔咔就上去了,之前放Update里直接运行是60帧。现在是380帧。在这里插入图片描述

在这里插入图片描述
现在试试用委托,正常用会报错
InvalidOperationException: Job.action is not a value type. Job structs may not contain any reference types.
但是,有挺多大佬整了几个骗过上帝的东西。这里用的是https://blog.youkuaiyun.com/buxingynjian225/article/details/91125619?ops_request_misc=&request_id=&biz_id=102&utm_term=unityjob%E5%A7%94%E6%89%98&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-1-91125619.142v9pc_search_result_control_group,157v4control&spm=1018.2226.3001.4187

的JobAction。效率同样提高到了370帧左右。好东西啊

Unity ECS(Entity Component System)是Unity引擎的一种编程范式,它是一种数据驱动的编程模型,它将游戏对象(Entity)分解为数据和行为两个部分,其中数据由组件(Component)来表示,行为则由系统(System)来实现。相对于传统的面向对象编程模型,ECS提供了更高效、更灵活的编程方式,可以有效地提高游戏的性能和扩展性。 下面是我学习Unity ECS时的笔记: ## Entity Entity是ECS中最基本的概念,它表示游戏对象。每个Entity由一个唯一的ID来标识,可以通过EntityManager来创建、销毁、查询和管理Entity。 ## Component Component是Entity的数据部分,用来描述Entity的属性和状态。每个Component包含一些数据成员和一些方法,用来操作这些数据成员。Component是以结构体(struct)的形式定义的,通常只包含数据成员,不包含方法。 ## System System是Entity的行为部分,用来实现游戏逻辑和操作Component。System可以访问和操作EntityManager和Component,但不能直接访问Entity。每个System包含一个或多个Component,表示它所处理的数据类型。System是以类(class)的形式定义的,通常包含一个Update方法,用来实现游戏逻辑。 ## Job Job是一种轻量级的线程,用于并行执行System中的任务。Job可以访问和操作Component,但不能直接访问Entity和EntityManager。Job通常是以结构体(struct)的形式定义的,不包含方法。 ## Archetype Archetype是Entity的集合,包含一组具有相同Component类型的Entity。Archetype可以用来优化数据的访问和处理,可以在不同的System之间共享。 ## Chunk Chunk是Archetype中的数据块,包含一组连续的Entity和它们的Component数据。Chunk可以用来优化内存的分配和访问,可以在Job中进行并行处理。 ## Buffer Buffer是一种Component类型,用来存储可变长度的数据,例如数组或列表。Buffer可以在System和Job中进行修改和访问。 以上是我学习Unity ECS时的笔记,希望对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值