使用Unity C#作业系统时,请确保遵守以下内容:

不要从作业访问静态数据

从作业访问静态数据会绕过所有安全系统。如果您访问错误的数据,您可能会以意想不到的方式崩溃Unity。例如,访问MonoBehaviour可能会导致域重新加载崩溃。

注意:由于存在这种风险,Unity的未来版本将阻止使用静态分析从作业进行全局变量访问。如果您确实访问作业中的静态数据,则应该期望您的代码在Unity的未来版本中中断。

刷新预定批次

如果希望作业开始执行,则可以使用JobHandle.ScheduleBatchedJobs刷新计划批处理。请注意,调用此方法会对性能产生负面影响。不刷新批处理会延迟调度,直到主线程等待结果。在所有其他情况下,使用JobHandle.Complete来启动执行过程。

注意:在实体组件系统(ECS)中,将为您隐式刷新批处理,因此JobHandle.ScheduleBatchedJobs不需要调用。

不要尝试更新NativeContainer内容

由于缺少ref返回,因此无法直接更改NativeContainer的内容。例如,nativeArray[0]++;var temp = nativeArray[0]; temp++;不更新值的nativeArray写入相同。

相反,您必须将索引中的数据复制到本地临时副本,修改该副本并将其保存回来,如下所示:

MyStruct temp = myNativeArray[i];
temp.memberVariable = 0;
myNativeArray[i] = temp;

致电JobHandle.Complete以重新获得所有权

跟踪数据所有权需要在主线程再次使用它们之前完成依赖项。检查JobHandle.IsCompleted是不够的。您必须调用该方法JobHandle.Complete以重新获得NativeContainer主线程的类型的所有权。调用Complete还可以清除安全系统中的状态。不这样做会引入内存泄漏。如果您在每个帧中安排新作业,并且依赖于前一帧的作业,则此过程也适用。

在主线程中使用Schedule和Complete

你只能调用ScheduleComplete主线程。如果一个作业依赖于另一个作业,则使用JobHandle管理依赖关系而不是尝试在作业内安排作业。

在合适的时间使用计划和完成

Schedule只要您拥有所需的数据就立即打电话给工作,并且Complete在您需要结果之前不要打电话给它。优秀的做法是安排一个您不需要等待的工作,而不是与正在运行的任何其他工作竞争。例如,如果在一帧结束和下一帧的开始之间没有作业正在运行,并且可以接受一帧延迟,则可以将作业调度到帧的末尾并使用其结果在以下框架中。或者,如果您的游戏与其他工作的转换期间相比,并且框架中的其他位置存在大量未充分利用的时间段,则更有效地安排您的工作。

将NativeContainer类型标记为只读

请记住,作业NativeContainer默认情况下对类型具有读写访问权限。[ReadOnly]适当时使用该属性可提高性能。

检查数据依赖性

在Unity Profiler 窗口,主线程上的标记“WaitForJobGroup”表示Unity正在等待工作线程上的作业完成。此标记可能意味着您已在某处应引入数据依赖关系。寻找JobHandle.Complete跟踪数据依赖关系的位置,这些数据依赖关系迫使主线程等待。

调试作业

作业具有一个Run函数,您可以使用它来代替Schedule在主线程上立即执行作业。您可以将其用于调试目的。

不要在作业中分配托管内存

在作业中分配托管内存非常慢,并且该作业无法使用Unity Burst编译器来提高性能。Burst是一种新的基于LLVM的后端编译器技术,可以让您更轻松。它需要C#作业并利用您平台的特定功能生成高度优化的机器代码。

更多的信息

C#作业系统提示和故障排除的更多相关文章

  1. linux下抓取tomcat相关内存、线程、文件句柄等快照,用于故障排除。

    以下脚本推荐放在定时任务里,写好cron表达式,在不影响业务系统的情况下dump一些信息分析系统性能瓶颈以及故障排除. 因为每次dump的时候jvm会暂停(几秒到几十秒不等).所以在生产系统使用时慎用 ...

  2. Linux系统之TroubleShooting(故障排除)(转)

    尽管Linux系统非常强大,稳定,但是我们在使用过程当中,如果人为操作不当,仍然会影响系统,甚至可能使得系统无法开机,无法运行服务等等各种问题.那么这篇博文就总结一下一些常见的故障排除方法,但是不可能 ...

  3. Linux系统之TroubleShooting(启动故障排除)

    尽管Linux系统非常强大,稳定,但是我们在使用过程当中,如果人为操作不当,仍然会影响系统,甚至可能使得系统无法开机,无法运行服务等等各种问题.那么这篇博文就总结一下一些常见的故障排除方法,但是不可能 ...

  4. 细化如何安装LNMP + Zabbix 监控安装文档以及故障排除

    1.LNMP所需安装包: 上传如下软件包到/soft目录中 mysql- (centos6. 64位自带)也可根据版本自行挑选,前提你了解这个版本 pcre-8.36.tar.gz nginx-.ta ...

  5. 第十篇 Replication:故障排除

    本篇文章是SQL Server Replication系列的第十篇,详细内容请参考原文. 复制故障排除是一项艰巨的任务.在任何复制设置中,都涉及到很多移动部件,而可用的工具并不总是很容易识别问题.Th ...

  6. DNS服务器的维护与故障排除

    1. DNS故障诊断的常用工具或命令 诊断DNS解析故障的四个常用命令工具: ①unbound-checkconf:用于检查unbound服务器配置文件的语法错误 ②unbound-control:是 ...

  7. 【译】第十篇 Replication:故障排除

    本篇文章是SQL Server Replication系列的第十篇,详细内容请参考原文. 复制故障排除是一项艰巨的任务.在任何复制设置中,都涉及到很多移动部件,而可用的工具并不总是很容易识别问题.Th ...

  8. 学习笔记:CentOS7学习之十八:Linux系统启动原理及故障排除

    目录 学习笔记:CentOS7学习之十八:Linux系统启动原理及故障排除 18.1 centos6系统启动过程及相关配置文件 18.1.1 centos6系统启动过程 18.1.2 centos6启 ...

  9. spark 性能优化 数据倾斜 故障排除

    版本:V2.0 第一章       Spark 性能调优 1.1      常规性能调优 1.1.1   常规性能调优一:最优资源配置 Spark性能调优的第一步,就是为任务分配更多的资源,在一定范围 ...

随机推荐

  1. Linux文件系统之mv(重命名/移动文件)

    mv(move)命令 输入man mv,了解到mv命令是用于移动或重命名文件 语法 mv [options] source dest mv [options] source... directory ...

  2. 长春理工大学第十四届程序设计竞赛H Arithmetic Sequence——使用特例

    题目 链接 题意:给定一个数X,输出一个等差数列,使得和为X. 分析 由等差数列的定义,可见一个数就是等差数列,两个数也是等差数列 #include<bits/stdc++.h> usin ...

  3. MySQL剖析单条查询

    使用SHOW PROFILE SHOW PROFILE命令默认是禁用的,可以通过以下命令修改 SET profiling=1; 当一条查询提交给服务器时,,此工具会记录剖析信息到一张临时表,并且给查询 ...

  4. BZOJ 3217: ALOEXT (块状链表套trie)

    第一次写块状链表,发现还挺好写的,但是一点地方写错加上强制在线就会各种姿势WA/TLE/RE爆- 想法就是分块后,在每一个块上维护最大值和次大值,还在每一个块上维护一棵trie树来求异或最大值.散块直 ...

  5. Chrome和Safari浏览器preventDefault报treated as passive错误

    Chrome和Safari浏览器preventDefault报treated as passive错误 问题代码是: document.addEventListener('touchmove', fu ...

  6. $ python manage.py makemigrations You are trying to add a non-nullable field 'name' to course without a default; we can't do that (the database needs something to populate existing rows). Please selec

    问题: $ python manage.py makemigrationsYou are trying to add a non-nullable field 'name' to course wit ...

  7. CodeForces 835D - Palindromic characteristics | Codeforces Round #427 (Div. 2)

    证明在Tutorial的评论版里 /* CodeForces 835D - Palindromic characteristics [ 分析,DP ] | Codeforces Round #427 ...

  8. Java项目出现的问题--实际项目01

    1   从Excel中导入指纹图谱数据异常 在导入指纹图谱时对Excel的规范是有限制的,有时候报空指针异常是因为虽然有些地方看起来没有内容但是可能有空格键:解决方法是新建一个Excel表,把要用到的 ...

  9. kubernetes 存储volume,pv和pvc的使用

    emptyDIR 临时目录 hostPath :使用主机的路径 网络存储: 传统的设备存储:NAS,SAN 分布式存储:glusterfs,rbd,cephfs 云存储:EBS,Azure,阿里云的 ...

  10. sudo/su

    linux用户分为根用户/ 普通用户 系统用户 根用户和普通用户是可以实际登录到系统中的,普通用户是没办法使用useradd添加新用户的,只有根用户有权限 当然,也可以使用su su 是切换用户的意思 ...