目录

  • 前言
  • Unity Jobs System
  • C# Jobs Systems
  • Blittable Types VS Non-Blittable Types
  • NativeContainers
  • Native Container
  • Allocation Types

前言


本文是Metaverse大衍神君的《DOTS之路》系列课程的学习笔记

Unity Jobs System


  • 包含C# Jobs System 与 C++ Jobs System
  • 利用多核计算平台来简单安全的编写与执行多线程代码
  • 既可以与ECS结合使用也可以单独使用
  • 不需要关系平台CPU核心资源情况

Job System 是通过创建Job任务而非线程来管理多线程代码的
Unity引擎内部会跨多个核心来管理多个线程,以避免上下文的切换

执行时,Job System 会将我们创建的Job任务放到Job队列中以等待执行
工作线程会从Job队列中获取并执行相应的工作

整套系统听起来很简单,但如果我们自己要去实现一套多线程调度框架的话
需要考虑不同的平台、不同的操作系统、不同的硬件核心数、线程调度导致的性能问题等诸多因素
其实是非常复杂且麻烦的

而在Unity下,我们只需要学习C#部分的Job System接口与代码编写规则
而其他方面的工作Unity都帮我们处理好了

目前Unity引擎内部C++的JobSystem部分,需要Untiy引擎源码才可以学习
而C# JobSystem部分Unity提供了C#代码封装后的Job System接口
使用起来也更加简单、直接

虽然C# Job System接口不多,但是分布在

  • UnityEngine.Jobs
  • Unity.Jobs
  • Dots的核心包Collections
  • 等多个地方

本来还有Jobs Package的扩展包
但现在Jobs Package的扩展包已经被移除了
随着DOTS1.0的出现,Job包已经被合并到DOTS1.0的核心包Collections中了
只不过目前还在DOTS的环境包中存在
未来Package Manager中旧不会有它的身影了

另外C# JobSystem的一些旧接口也只是暂时保留
一些新的接口已经开始取代老接口
更多的接口与用法也在不断的添加进来

如果是熟悉以前版本的Job System还需要继续补课

C# Jobs Systems

  • No Race Conditions

    • 只访问数据的拷贝
    • 或者可以转换一段buffer的所有权给这个Job(Native Container)
  • 使用和Unity引擎内C++JobSystem系统的代码
    • 引擎和游戏线程之间没有上下文切换的开销

一般情况下,
在C# Jobs Systems中一般不会引发我们手写多线程程序中出现的Race Conditions问题
原因是在每个Job任务中,只访问数据的拷贝,或是转换一段buffer的所有权给Job任务

另外C# Jobs Systems 实际上使用的就是Unity引擎内C++Job Systems 的代码
所以在引擎与游戏线程之间并没有上下文切换的开销
但毕竟C#与C++下的内存管理与值的类型定义是不同的
所以在写C#Jobs Systems代码时
我们需要区别哪些是Blittable Types类型的数据,哪些类型是 Non-Blittable Types类型的数据

Blittable Types VS Non-Blittable Types

  • Blittable Types:在托管代码和非托管代码的内存中具有相同的表示形式
Blittable Types Non-Blittable Types
System.Byte System.Array
System.SByte System.Boolean
System.Int16 System.Char
System.UInt16 System.Class
System.Int32 System.Object
System.UInt32 System.Mdarray
System.InBt64 System.String
System.IntPtr System.Valuetype
System.UIntPtr System.Szarray

值得一提的是,关注C#下的布尔类型
C#中的布尔值和C++中的布尔值不同
C++中的布尔值占用1个字节,但C#中的布尔值占用4个字节
如果没留意直接使用指针引用的话,程序不会崩溃
但是出现出乎意料的结果,非常难以调试

NativeContainers

  • NativeArray
  • NativeSlice-NativeArray的子集
  • TransformAccess
  • TransformAccessArray
  • Unity Collections Package
    • NativeList-可变大小的NativeArray
    • NativeHashMap-key/value pairs
    • NativeMultiHashMap-单key多值的Pairs
    • NativeQueue-一个FIFO的queue
    • 多线程同时写入版本的NativeHash Map\NativeMultiHashMap\NativeQueue
    • 自定义的Native Containers

我们在写Job程序时,除使用Blittable Types类型数据外还可以使用C++上非托管内存堆数据
不过这里需要依赖另外一个Dots核心包Collections中的NativeContainers
以及Unity引擎下为特殊用途特殊定义的一些容器类型
如Unity引擎内定义的数据——NativeArray
以及数组切片子集NativeSlice
还有用于映射访问gameObject的Transform对象的
TransformAccess和TransformAccessArray
还有Collections包中定义的
可变大小的数组——NativeList
按键值对隐射表——NativeHashMap
单键多值的——NativeMultiHashMap
迁进迁出的Native队列——NativeQueue
支持多线程同时写入的各种数据容器等
除此之外Collections包中还提供了可自定义的NativeContainer接口

Native Container

  • 非托管内存
  • 有DisposeSentinel来避免内存泄漏错误
  • 有AtomicSafetyHandle来追踪所有权与权限
  • 需要手动dispose释放
  • 没有引用返回,会在C#7中支持

Allocation Types

  • Persistent

    • 长生命周期内存
  • TempJob
    • 只在Job中存在的短生命周期,4帧以上会收到警告
  • Temp
    • 一个函数返回前的短生命周期

【DOTS学习笔记】从第一个Jobs程序入门相关推荐

  1. C#.NET学习笔记2---C#.第一个C#程序

    C#.NET学习笔记2---C#.第一个C#程序 技术qq交流群:JavaDream:251572072  教程下载,在线交流:创梦IT社区:__________以前的网站现在不弄了,抱歉 6.第一个 ...

  2. MyBatis学习笔记2 ——第一个MyBatis程序

    MyBatis学习笔记2 --第一个MyBatis程序 参考教程B站狂神https://www.bilibili.com/video/BV1NE411Q7Nx 环境搭建 建立一个mybatis数据库用 ...

  3. Spark学习笔记1——第一个Spark程序:单词数统计

    Spark学习笔记1--第一个Spark程序:单词数统计 笔记摘抄自 [美] Holden Karau 等著的<Spark快速大数据分析> 添加依赖 通过 Maven 添加 Spark-c ...

  4. 学习笔记之04-第一个OC程序解析

    查看项目结构可以发现这个程序中只有一个源文件:main.m 打开main.m文件,代码如下 1 #import <Foundation/Foundation.h> 2 3 int main ...

  5. OpenGL学习笔记:第一个OpenGL程序完全注释

    运行环境: CentOS7 g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16) OpenGL实现厂商的名字:VMware, Inc. 渲染器标识符:Gallium ...

  6. 廖雪峰官方网站python学习笔记:第一个Pyhon程序

    输入和输出 print() print()函数可以接受多个字符串,用逗号","隔开,就可以练成一串输出: >>>print('The quick brown fo ...

  7. node学习笔记,第一个Node程序

    编辑 JavaScript代码将在Node环境中执行 first-node.js // 严格模式 'use strict';console.log('Hello, world.'); console. ...

  8. Spring学习笔记:第一个Spring Boot程序HelloWorld

    Spring学习笔记:第一个Spring Boot程序HelloWorld 一.跟着 Spring 了解技术趋势 1.看看 Spring 5.x 的改变暗示了什么 2.Spring Boot 和 Sp ...

  9. Unity DOTS 学习笔记1 - ECS 0.50介绍和安装

    Unity DOTS 学习笔记1 - ECS 0.50介绍和安装 为什么学习这个技术 ECS的全称为Entity Component System,是最早由暴雪在GDC2017上提出的一个新的游戏设计 ...

最新文章

  1. hdu1518 bjfuoj1042 zoj1909 poj2362 经典的搜索加剪枝
  2. OSSIM系统用户审计
  3. C#注册URL协议,使用浏览器打开本地程序,类似网页上点了QQ交谈打开本地QQ客户端程序...
  4. 分布式链路跟踪中的 traceid 和 spanid 代表什么?
  5. gdb 10.2的安装
  6. linux系统脚本安装失败,ubuntu16.04下vim安装失败的原因分析及解决方案
  7. mybatis update 返回值
  8. 【Foreign】字串变化 [DP]
  9. python 处理CSV数据
  10. 数据可视化(5)--jqplot经典实例
  11. SQL Server触发器创建、删除、修改、查看
  12. xamarin.android pullToRefresharp.Android下拉刷新样式、侧滑删除功能
  13. Hadoop体系结构– YARN,HDFS和MapReduce
  14. canny检测的matlab,canny边缘测试及matlab实现
  15. Failed to save persistent token
  16. 用数据来看马拉多纳究竟有多么闪耀!!!
  17. Biotin-PEG-CHO,生物素PEG醛基
  18. 基于MATLAB的语音去噪处理系统
  19. 网络加速器的加速原理
  20. PDR (Pedestrian Dead Reckoning)行人航位推算基本原理及实现

热门文章

  1. 梦里什么都有(状压DP)
  2. c语言19之用1元5角钱人名币兑换5分、2分和1分的硬币(每一种都要有)共一百枚,问共有几种兑换方案?并输出每种方案
  3. Mybatis The error may involve defaultParameterMap ### The error occurred while setting parameters
  4. js制作12进制的时钟特效
  5. PS修改PSD源文件
  6. 拼多多商品APi、商品详情、产品页面信息接口
  7. 用tensorflow进行数据增强
  8. 水塔流量的估计matlab,估计水塔的水流量
  9. mysql8实战_实战MySQL8.0.17 Clone Plugin
  10. 通达OA2019升级到V12的操作方法