前几篇提过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