unity text不能刷新_Unity学习—JobSystem

本文详细介绍了Unity的JobSystem,它管理多核工作线程,确保线程安全。Job是执行特定任务的工作单元,可互相依赖。文章涵盖了Job的创建、调度、数据管理以及优化技巧,包括NativeContainer、Allocator的选择和IJobParallelFor的使用,强调了避免静态数据访问和正确管理数据所有权的重要性。
摘要由CSDN通过智能技术生成

译自官方手册,简述 Unity 另一个多线程接口,JobSystem,为 Unity ECS 系统的主要实现方式

原文

JobSystem

JobSystem 管理一组多核中的工作线程(Work Thread),为避免上下文切换通常一个逻辑核配一个工作线程

JobSystem 持有一个 Job 队列,工作线程从该队列中获取 Job 执行

Job 是执行特定任务的小工作单元,Job 可以互相依赖

线程安全

JobSystem 执行时复制而非引用数据,避免了数据竞争,但 JobSystem 只能使用memcpy复制 blittable types 数据。Blittable types 是 .Net 框架中的数据类型,该类型数据在托管代码与原生代码间传递无需转换

NativeContainer

复制数据来保证线程安全的弊端就是任务的结果也是独立的,因此使用NativeContainer将结果储存在公共内存中

NativeContainer以相对安全的托管类型的方式指向一个非托管的内存地址,使Job 可以直接访问主线程数据而非复制

Unity 自带 NativeContainer类型为 NativeArray,ECS 包又扩展了NativeListNativeHashMapNativeMultiHashMapNativeQueue

默认情况下,Job 同时拥有NativeContainer的读写权限,但 C# Job System 不允许多个 Job 同时拥有对一个NativeContainer的写权限,因此对不需要写权限的NativeContainer加上[ReadOnly]特性,以减少性能影响

[ReadOnly]
public NativeArray<int> input;

JobSystem 支持多个 Job 同时读取同一数据

NativeContainer Allocator

根据 Job 执行时长决定使用哪种 Allocator

  • Allocator.Temp

最快的分配方法,适用于一帧或几帧的生命时长,不能将该类型分配的数据传给 Job,在方法 Return 前执行Dispose

  • Allocator.TempJob

分配速度比 Temp 慢比 Persistent 快,4帧的生命时长且线程安全。若四帧内没有调用Dispose,控制台会打印原生代码生成的警告。大部分小任务都使用该类型分配NativeContainer

  • Allocator.Persistent

是对malloc的包装,能够维持尽可能地生命时长,性能不足的情况下不应使用

Nativ
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值