Unity学习笔记:Job system

这篇具有很好参考价值的文章主要介绍了Unity学习笔记:Job system。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Unity的job system可以让我们编写简单且安全的多线程代码,从而让我们的游戏可以使用所有可用的CPU内核来执行代码。这样可以提升我们的游戏的性能。

Job system概述

Unity的job system可以帮助我们写出多线程代码,从而我们的游戏可以使用所有可用的CPU内核来执行代码。job system为我们提供了更好的游戏性能,因为我们的游戏可以更高效的使用所有正在运行的CPU内核的容量,而不是将所有的代码运行在一个CPU内核上。

我们可以单独使用job system,但为了追求更好的性能,我们应该同时使用Burst编译器,它是专门为了编译job system中的jobs而设计的。Burst编译器改进了代码的生成,从而提高了性能并减少了移动设备上的电池消耗。

我们还可以使用job system配合Unity的ECS来创建高性能的面向数据的代码。

多线程

Unity使用它原生的job system在多个工作线程上处理它的原生代码,这取决于运行我们游戏的设备上可用的CPU内核数量。通常情况下Unity只在一个线程上执行我们的代码,默认在程序开始时运行,这个线程被称为主线程。然而,当我们使用了job system,Unity就会在多个工作线程上执行我们的代码,这个被称为多线程。

多线程利用了CPU在多个内核上同时处理大量线程的能力。任务或指令不是一个接一个地执行,而是同时运行。工作线程彼此并行运行,并在完成后与主线程同步它们的结果。

Unity的job system可以确保有足够的线程来匹配多个CPU内核的容量,这意味着我们无需关心有多少CPU内核可用,就可以尽可能多的调度任务。这和其他的一些依赖诸如线程池技术的作业系统不同,那样的作业系统很容易出现无效地创建出多于CPU内核数的线程的情况。

工作窃取机制

Unity的job system使用了工作窃取机制作为其调度策略的一部分,通过这一机制,以实现均匀分配跨工作线程共享的任务。每一个工作线程都有可能比其他线程更快的处理好任务,因此,一旦一个工作线程完成了所有任务的处理,它就会查看其他工作线程的任务队列,然后去处理原本分配给其他工作线程的任务。

安全系统

为了让开发者更便捷的写出多线程代码,Unity的job system有一个安全系统,它可以检测所有潜在的race condition并且保护我们的代码避开他们可能导致的bug。race condition指的是两个或多个线程或进程在竞争访问共享资源的时候,因为时序上的差异,导致程序的执行结果出现不确定性的情况。例如,如果job system将我们代码中主线程的一个数据引用发送给了一个工作线程,那么就无法确定工作线程在写入数据的同时主线程是否正在读取数据,这个情景就构成了一个race condition。为了解决这个问题,Unity的job system向每一个工作线程发送的是它所要操作的数据的拷贝,而不是主线程中对该数据的引用,这个拷贝隔离了数据,从而消除了race condition。

job system的这种拷贝数据的方式意味着一个job只能访问blittable类型的数据。这些类型的数据在托管代码和原生代码之间传递时不需要转换。job system使用memcpy的方式来拷贝blittable类型的数据,并在托管代码和Unity原生代码之间传输数据。它在调度job时使用memcpy将数据存放到原生内存中,并在执行job时允许托管端访问该副本。

Collections包

除了Unity engine核心包里提供的job system,作为补充,Collections包还扩展了许多job类型和本地容器。

Jobs概述

一个job是完成某项特定任务的工作的一小部分,一个job接收参数并对数据进行操作,这个行为类似于方法的调用。job可以是独立,也可以依赖于其他job完成后才能运行。在Unity中,job指的是任何实现了IJob接口的结构体。

只有主线程可以调度和完成jobs。它不能访问任何正在运行的job的内容,两个job不能同时访问一个job的内容。为了确保job的有效运行,我们可以使它们互相依赖。Unity的job system允许我们创建复杂的依赖链,以确保我们的job以正确的顺序完成工作。

Job的类型

IJob: 在一个job线程上运行单个任务。

IJobParallelFor: 并行运行任务。每个并行运行的工作线程都有一个唯一的索引,以便安全地访问工作线程之间的共享数据。

IJobParallelForTransform: 这是专门用于并行处理Transform组件的Job接口。

IJobFor: 与IJobParallelFor相同,但允许我们调度job,使其不会并行运行。文章来源地址https://www.toymoban.com/news/detail-828822.html

到了这里,关于Unity学习笔记:Job system的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 分布式任务调度平台XXL-JOB学习笔记-helloworld运行

    环境:win10 eclipse java17 mysql8.0.17 xxl-job 2.4 源码:https://github.com/xuxueli/xxl-job/ 导入时按Existing Maven Projects导入,先导入xxl-job-admin(管理平台)和xxl-job-executor-sample-springboot(通过springboot管理的执行器实例)。 如果导入时速度非常慢,或者报错如 Plugin ‘org.apache.maven.plugins:maven-

    2024年02月13日
    浏览(50)
  • ORB-SLAM2学习笔记7之System主类和多线程

    ORB-SLAM2是一种基于特征的视觉 SLAM ( Simultaneous Localization and Mapping )系统,它能够从单个、双目或 RBGD 相机的输入中实时地同时定位相机的位置,并构建环境的三维地图。 ORB-SLAM2 是在ORB-SLAM的基础上进行改进和扩展的版本。

    2024年02月12日
    浏览(54)
  • 【Unity学习笔记】Unity TestRunner使用

    转载请注明出处:🔗https://blog.csdn.net/weixin_44013533/article/details/135733479 作者:CSDN@|Ringleader| 参考: Input testing Getting started with Unity Test Framework HowToRunUnityUnitTest 如果对Unity的newInputSystem感兴趣可以参看我这篇文章:【Unity学习笔记】第十二 · New Input System 及其系统结构 和 源码浅

    2024年01月22日
    浏览(37)
  • 【Unity_Input System】Input System新输入系统(一)

    目录 一、导入Input System包 二、使用方式1:直接从输入设备对应类中获取输入 三、使用方式2:用代码创建InputAction获取输入 四、使用方式3:用Player Input组件获取输入 五、使用方式4:用Input Action Asset生成C#代码获取输入 打开包管理器,搜索Input System,点击右下角安装。 安装

    2024年02月08日
    浏览(44)
  • 【Unity_Input System】Input System新输入系统(二)

    目录 六、Action Phase 七、Input Action Asset文件 1.Bindings Mode  1Binding 2PositiveNegative Binding 3UpDownLeftRight Composite 4UpDownLeftRightForwardBackward Composite 5Binding with one modifier 6Binding with two modifier 2.Binding Path 3.Action Type 4.Initial State Check 5.Interaction 1Default Interaction 2Press Interaction 3Hold Inter

    2024年02月03日
    浏览(53)
  • Unity学习笔记(一)Unity的界面和操作

    Unity官方教程 :Unity User Manual 2021.3 (LTS) - Unity 手册 UnityLearn :Learn Game Development Without Coding Experience | Unity 如何导入一个Asset Store的包? 以安装 Playground 为例。 (1)获取:从Asset StoreUnity Playground | 视频教程项目资源 | Unity Asset Store (2)导入:在 Asset Store (unity.com) 商店中选择

    2023年04月08日
    浏览(45)
  • 【Unity学习笔记】AssetBundle

    AssetBundle是Unity提供的一种用于存储资源的压缩集合,它可以存储任何一种Unity可以识别的资源,如模型,纹理图,音频,场景等资源。也可以加载开发者自定义的二进制文件。 Resources打包时会将所有的资源统统打包到Resources中,这意味着即使你只想要其中的部分资源,也需要

    2024年02月16日
    浏览(38)
  • Unity AssetBundle学习笔记

    目录 基础介绍 动态资源加载 更新和添加内容 打包策略 资源分组 频繁更新的资源 资源压缩 Unload(true)和Unload(false) Unload(false) Unload(true) 确定何时卸载 引用计数 场景和状态管理 资源使用频率 内存预算和监控 用户输入和游戏逻辑 处理依赖关系  依赖管理 使用 AssetBundl

    2024年02月02日
    浏览(44)
  • Unity学习笔记 - API

            API(Application Programming Interface,应用程序编程接口) 是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。 Unity可以引用的所有对象的基类。 UnityEngine.Object类是Uni

    2023年04月25日
    浏览(32)
  • Unity学习笔记

    本文为作者原创,版权所有,侵权必究。 目录 一、前言 学习Unity的契机 二、学习Unity(项目驱动) 1.环境配置与准备 2.新建项目(默认为My Project) 3.创建游戏对象 三、总结 1.新一线城市纷纷出台有关扶持元宇宙的政策,电子游戏为其中重点之一。 2.后疫情时代大众外出频率

    2024年02月03日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包