UnityECS学习日记六:Unity Job System

前几篇提过ECS系统的好基友:Unity Job System ,这个是untiy为我们提供多线程开发的基础库。先前说过我们平时Update多是单线程开发,unity早就支持多线程开发。而c#的多线程开发中子线程不能操控UI线程。

我们需要了解什么是多线程开发:

1.上下文环境隔离

比如妈妈拿钱让小孩去打酱油,钱对于妈妈来说不再控制了,上下文运行环境是隔离的。

2.进程同步技术

比如妈妈等酱油回来拿去炒菜,所以进程之间会有个数据交换和等待同步。

3.竞争与冲突

比如平时对 文件操作时,不能又读又写。

4.并行和并发的关系和区别

并行:多个核心同时运行,孩子去打酱油,妈妈先洗菜

并发:是同一时间轮询计算

详情参照:https://www.jianshu.com/p/cbf9588b2afb

也有大佬翻译了官方文档:https://zhuanlan.zhihu.com/c_1078686690062942208

真正掌握多线程开发(可到网上自行搜索):

1.什么是协程

2.什么是进程

3.什么是线程

4.什么是并发

5.什么是并行


Job作业系统与传统的c#提供的多线程开发库有什么区别?

1.job协同Burst编译器可以提高代码的生成质量,这也会使得移动端电量消耗大幅度降低。c# Job System的一个非常关键的方面是它可以融入Unity内部的原生Job Sytem。这使得用户的代码可以和Unity共享worker threads。

2.资源竞争和安全性系统:通过给每个需要操作数据的Job一份数据的拷贝,而不是主线程中数据的引用来避免这个问题。拷贝和原来的数据独立,从而排除了资源竞争。拷贝数据类型必须是可以位块传输的数据类型(blitable data types)。在托管代码和原生代码之间进行传递的时候不需要类型转换。

3.数据共享:安全性系统中拷贝数据的缺点是单个job的计算结果是与外部隔离的。为了突破这个限制,我们需要把结果放在一个共享内存 ------NativeContainer中。NativeContainer是一种托管的数据类型,为原生内存提供一种相对安全的C#封装,它包括一个指向非托管分配内存的指针。当和Unity C# Job System一起使用时,一个NativeContainer使得一个Job可以访问和主线程共享的数据,而不是在一份拷贝数据上工作。

4.针对游戏帧进行了特殊的优化


Unity为啥要重新封装一套自己的多线程库而不是直接使用c#成熟的库?

因为Unity原生内部是基于c或c++高效的代码,肯定比c#的托管代码效率要高,unity使用轻量级的编译器(Burst)做并行的优化,使用并行的指令集肯定比C#效率高,为移动端量身而作。

Entity Component System(ECS)包扩展了Unity.Collection命名空间,包含了其他类型的NativeArray:

1.NativeList 一个可变长的NativeArray

2.NativeHashMap 键值对

3.NativeMultiHashMap 每个Key可以对应多个值

4.NattiveQueue 一个先进先出(FIFO)队列


想必经常查看博客的同学对宣雨松也很熟悉吧,最近大佬在UUG北京开发者活动上也讲解了UnityECS,详情在b站:https://www.bilibili.com/video/av79798154?from=search&seid=16293952182527230202

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值