Job System概述


前言

最近查漏补缺,稍微学习一下Job System的理念。在此作下记录。

背景

目前大部分游戏和应用都只使用单核,Job System出现的目的就在于允许游戏尽可能使用可使用的CPU核,从而并行加速运行游戏。更具体地说,使用多核可以在不优化thread-time(CPU指令用于计算的时间)的情况下减少wall-time(一个任务从开始到结束的时间)。

优势

使用Job System来减少wall-time最简单的方法就是使用ParallelFor jobs。一个ParallelFor job被用于处理大量以相同方式处理的数据。

本质上,在Job System中,每个在队列中等待被处理的item都是通过job来进行处理的,每个job可以使用CPU多核并行地处理。

实际上,job的数量远小于要处理item的数量,每个job对应一个CPU核对应多个item。当某个job处理完它自己所有的item后,如果还有其他job没有处理完item,就会去监听其他job并且协助处理剩余的item。

如果系统中有非常多相似的item,那ParallelFor会非常地管用。即使系统中没有那么多相似的item,使用Job System的设计方式也能让系统由单一不可分割的整体分成多个可自行运作的小单元(即job),让每个CPU核拥有处理job的线程,并行地处理这些job。只要item之间不相互依赖,我们所需要做的就只有合理调度job处理这些item,让job无需等待,效率拉满!

理念

“要么早开始,要么晚完成”。

很多时候,使用Job System时提倡一种“Schedule early, complete late”的概念,翻译过来就是“要么早点调度job,要么晚点完成job”。这种“要么早开始,要么晚完成”的模式目的就是为了保证主线程无需等待job完成。当主线程需要job处理完成的结果时,可以直接获取结果,因为理论上该job应该已经处理完成了(最理想的情况)。

实际上我们需要给job足够的时间来处理item。对于每个job来说,我们可以不用考虑什么时候开始或完成,前提是我们保证job从开始到完成的时间足够。为了让job运行的时间足够,如果我们可以允许一帧延迟,甚至可以在下一帧来完成job。

每当我们在profiler中发现主线程在等待,我们就需要考虑主线程在等待的是什么,以及我们是否可以调度job让它运行地更早或者完成地更晚来避免主线程等待。

注意

Job System不是被设计用于长时间处理低优先级任务的,也不是被设计用于通过等待来避免抢占CPU资源的。所以说如果我们在使用Job System的时候出现了这样的问题,那么说明我们并没有合理地使用好Job System。

每个Job System的工作线程都会绑定一个CPU核(物理/虚拟)。所以一旦当线程开始处理job,job就会满核一直运行直到完成。

使用

C#提供了一种简单且安全的Job System。简单是C#提供了对应的接口可以快速job化代码;安全是C#在Job System的底层做了线程安全处理。

除此之外,Job System、ECS和Burst三者结合使用,可以极大化地提升运行性能。ECS是一种面向数据的框架,致力于通过将数据组织成cache-friendly以减少计算从而减少thread-time;而Burst则致力于通过优化代码从而减少thread-time。所有的这些策略都是为了解决大量计算所带来的性能问题。

后记

上面的内容是参考资料+自身理解所形成的记录,由于暂时缺乏自身的实践,所以很多实际使用上会出现的问题和坑没有遇到。

参考

https://blog.unity.com/technology/what-is-a-job-system

Job System概述相关推荐

  1. MySQL权限系统(一).The MySQL Access Privilege System 概述

    纯属个人阅读,如有翻译错误,请指出 The primary function of the MySQL privilege system is to authenticate a user who c ...

  2. java system_深入分析java中的System

    System是一个类,这个System类主要是一些与系统相关的属性和方法的集合,而且其内部的方法全部是静态的,所以我们直接使用System直接调用就好,比如我们常用的一个System.out.prin ...

  3. Java12-day03【​​​​​​​(类名、抽象类名、接口名)作为形参和返回值、内部类、常用API(Math、System、toString()、Arrays)、冒泡】

    视频+资料(工程源码.笔记)[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg   提取码:zjxs] Java基础--学习笔记(零起点打开java ...

  4. Java基础知识强化83:System类之gc()方法(垃圾回收)以及和finalize()区别

    1. System概述: System类包含一些有用的类字段和方法.它不能被实例化. 2. gc()方法:垃圾回收器 1 public static void gc()       调用gc方法暗示着 ...

  5. Google File System设计方面的问题汇总

    1.Google File System概述 google file system是一个分布式文件系统,针对的是数据密集型应用,提供容错功能,运行在低廉的服务器上,同时给大量的用户提供高性能服务.尽管 ...

  6. String、StringBuilder、Math、System基本知识总结

    1.String 概述:1.是字符串类,描述字符序列:2.所有的字符串常量都是String 的对象 3.字符串常量存在于方法区的字符串常量池中 4. 字符串对象的字面值其实就是一个字符串常量,所以字符 ...

  7. 详解Unity中的粒子系统Particle System (一)

    前言 游戏中很多炫酷效果的背后都离不开粒子系统,比如击中.爆炸.火焰.崩塌.喷射.烟雾等等.Unity也我们提供了强大的粒子系统,模块化的设计,上百个参数供我们调节使用,足以创造出非常震撼的效果了,本 ...

  8. asp.net编程网页弹窗显示变量_CODESYS Engineering:面向工程应用编程的工具软件

    CODESYS集成开发环境(CODESYS IDE)是整个自动化平台开发套件CODESYS中的核心部分之一,它几乎包含了一个先进的自动化编程开发工具应具有的所有功能. 1 CODESYS Develo ...

  9. Java部分集合以及部分常用类

    学习内容: 集合 1.1 Collection接口 1.2 List接口 1.3 Set接口 1.4 Map接口 常用类 2.1 Object 2.2 String 2.3 StringBuilder ...

最新文章

  1. linux dry run,dry run
  2. 笔记-信息系统开发基础-信息系统开发方法
  3. springboot中controller单例模式多线程安全的简单理解
  4. Java Switch Statement
  5. python1~10阶乘_小练习 python3 阶乘运算
  6. 【转】刨根究底字符编码【2.0版】(3):字符编码的由来、演变与ASCII码
  7. Integer缓存池
  8. 用javascript实现(页面正在加载的效果)
  9. Oracle创建表空间,新增用户分配表空间,赋予用户权限
  10. ImportError: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `CXXABI_1.3.9‘ not found
  11. eprime2.0 倒计时功能
  12. 安卓应用出海指南--发布到Google Play
  13. DP 动态规划(一) ——背包问题 学习总结(闫氏DP分析法)
  14. ros自己写避障算法_基于ROS的机器人室内环境探索、避障和目标跟踪方法与流程...
  15. 用Java编程开发“六级单词强化记忆”游戏
  16. OpenGL之GLEW安装
  17. 百胜中国2020年第四季度收入为22.6亿美元,同比增长11%
  18. SpringMVC IP权限设计
  19. JIL Widget开发入门
  20. KEAZ128学习(三)--- GPIO和PORT

热门文章

  1. 用java编国际象棋4之判断赢棋与和棋,实现自定义棋盘
  2. PS教你绘制超美的中国风工笔画效果
  3. linux网卡强制5G频率,用户反馈称Deepin 20对某些WIFI的5G信号无法接收,附解决办法...
  4. Qt之word转为pdf文件
  5. 【visum工作笔记】之一
  6. sparn on kerberos-yarn
  7. App 请求校验/加密方式总结
  8. 陕西省计算机高校排名,陕西省高校分档排名:西北大学位居榜首,第二档性价比高实力强...
  9. PDF分割成一页一页的怎么做?分享两种分割页面小妙招
  10. 异常处理:System.Xml.XmlException_缺少根元素