当前位置: 首页 > news >正文

网站建设网页设计师青海公路建设服务网站

网站建设网页设计师,青海公路建设服务网站,dk wordpress主题,中国住房和城乡建设厅网站并行化job ParallelFor jobs​docs.unity3d.com 当调度Jobs时#xff0c;只能有一个job来进行一项任务。在游戏中#xff0c;非常常见的情况是在一个庞大数量的对象上执行一个相同的操作。这里有一个独立的job类型叫做IJobParallelFor来处理此类问题。ParallelFor jobs当调…并行化job ParallelFor jobs​docs.unity3d.com 当调度Jobs时只能有一个job来进行一项任务。在游戏中非常常见的情况是在一个庞大数量的对象上执行一个相同的操作。这里有一个独立的job类型叫做IJobParallelFor来处理此类问题。ParallelFor jobs当调度Jobs时只能有一个job来进行一项任务。在游戏中非常常见的情况是在一个庞大数量的对象上执行一个相同的操作。这里有一个独立的job类型叫做IJobParallelFor来处理此类问题。 注意“并行化”job是Unity中所有实现了IJobParallelFor接口的结构的总称。 一个并行化job使用一个NativeArray存放数据来作为它的数据源。并行化job横跨多个核心执行。每个核心上有一个job每个job处理一部分工作量。IJobParallelFor的行为很类似于IJob但是不同于只执行一个Execute方法它会在数据源的每一项上执行Execute方法。Execute方法中有一个整数型的参数。这个索引是为了在job的具体操作实现中访问和操作数据源上的单个元素。 一个定义并行化Job的例子 struct IncrementByDeltaTimeJob: IJobParallelFor {public NativeArrayfloat values;public float deltaTime;public void Execute (int index){float temp values[index];temp deltaTime;values[index] temp;} } 调度并行化job 当调度并行化job时你必须指定你分割NativeArray数据源的长度。在结构中同时存在多个NativeArrayUnity时C# Job System不知道你要使用哪一个NativeArray作为数据源。这个长度同时会告知C# Job System有多少个Execute方法会被执行。 在这个场景中并行化job的调度会更复杂。当调度并行化任务时C# Job System会将工作分成多个批次分发给不同的核心来处理。每一个批次都包含一部分的Execute方法。随后C# Job System会在每个CPU核心的Unity原生Job System上调度最多一个job并传递给这个job一些批次的工作来完成。 一个并行化job划分批次到多个CPU核心 当一个原生job提前完成了分配给它的工作批次后它会从其他原生job那里获取其剩余的工作批次。它每次只获取那个原生job剩余批次的一半为了确保缓存局部性(cache locality)。 为了优化这个过程你需要指定一个每批次数量(batch count)。这个每批次数量控制了你会生成多少job和线程中进行任务分发的粒度。使用一个较低的每批次数量比如1会使你在线程之间的工作分配更平均。它会带来一些额外的开销所以有时增加每批次数量会是更好的选择。从每批次数量为1开始然后慢慢增加这个数量直到性能不再提升是一个合理的策略。 调度并行化job的例子 job代码 // Job adding two floating point values together public struct MyParallelJob : IJobParallelFor {[ReadOnly]public NativeArrayfloat a;[ReadOnly]public NativeArrayfloat b;public NativeArrayfloat result;public void Execute(int i){result[i] a[i] b[i];} } 主线程代码 NativeArrayfloat a new NativeArrayfloat(2, Allocator.TempJob);NativeArrayfloat b new NativeArrayfloat(2, Allocator.TempJob);NativeArrayfloat result new NativeArrayfloat(2, Allocator.TempJob);a[0] 1.1; b[0] 2.2; a[1] 3.3; b[1] 4.4;MyParallelJob jobData new MyParallelJob(); jobData.a a; jobData.b b; jobData.result result;// Schedule the job with one Execute per index in the results array and only 1 item per processing batch JobHandle handle jobData.Schedule(result.Length, 1);// Wait for the job to complete handle.Complete();// Free the memory allocated by the arrays a.Dispose(); b.Dispose(); result.Dispose(); ParallelForTransform jobs https://docs.unity3d.com/Manual/JobSystemParallelForTransformJobs.html一个ParallelForTransform job是另一个类型的ParallelFor job它是专门为了Transforms上的操作设计的。 注意ParallelForTransform job是Unity中所有实现了IJobParallelForTransform接口的结构的总称。 C# Job System建议和故障排除 C# Job System tips and troubleshooting​docs.unity3d.com 当你使用Unity C# Job System时确保你遵守以下几点C# Job System tips and troubleshooting当你使用Unity C# Job System时确保你遵守以下几点 不要从一个job中访问静态的数据 在所有的安全性系统中你都应当避免从一个job中访问静态数据。如果你访问了错误的数据你可能会使Unity崩溃通常是以意想不到的方式。举例来说访问一个MonoBehaviour可以导致域重新加载时崩溃。 注意因为这个风险未来版本的Unity会通过静态分析来阻止全局变量在job中的访问。如果你确实在job中访问了静态数据你应当预见到你的代码会在Unity未来的版本中报错。 刷新已调度的批次 当你希望你的job开始执行时你可以通过JobHandle.ScheduleBatchedJobs来刷新已调度的批次。注意调用这个接口时会对性能产生负面的影响。不刷新批次将会延迟调度job直到主线程开始等待job的结果。在任何其他情况中你应当调用JobHandle.Complete来开始执行过程。 注意在Entity Component System(ECS)中批次会暗中为你进行刷新所以调用JobHandle.ScheduleBatchedJobs是不必要的。 不要试图去更新NativeContainer的内容 由于缺乏引用返回值不可能去直接修改一个NativeContainer的内容。例如nativeArray[0] ;和 var temp nativeArray[0]; temp;一样都没有更新nativeArray中的值。 你必须从一个index将数据拷贝到一个局部临时副本修改这个副本并将它保存回去像这样 MyStruct temp myNativeArray[i]; temp.memberVariable 0; myNativeArray[i] temp; 调用JobHandle.Complete来重新获得归属权 在主线程重新使用数据前追踪数据的所有权需要依赖项都完成。只检查JobHandle.IsCompleted是不够的。你必须调用JobHandle.Complete来在主线程中重新获取NaitveContainer类型的所有权。调用Complete同时会清理安全性系统中的状态。不这样做的话会造成内存泄漏。这个过程也在你每一帧都调度依赖于上一帧job的新job时被采用。 在主线程中调用Schedule和Complete 你只能在主线程中调用Schedule和Complete方法。如果一个job需要依赖于另一个使用JobHandle来处理依赖关系而不是尝试在job中调度新的job。 在正确的时间调用Schedule和Complete 一旦你拥有了一个job所需的数据尽可能快地在job上调用Schedule在你需要它的执行结果之前不要调用Complete。一个良好的实践是调度一个你不需要等待的job同时它不会与当前正在运行的其他job产生竞争。举例来说如果你在一帧结束和下一帧开始之前拥有一段没有其他job在运行的时间并且可以接受一帧的延迟你可以在一帧结束的时候调度一个job在下一帧中使用它的结果。或者如果这个转换时间已经被其他job占满了但是在一帧中有一大段未充分利用的时段在这里调度你的job会更有效率。 将NativeContainer标记为只读的 记住job在默认情况下拥有NativeContainer的读写权限。在合适的NativeContainer上使用[ReadOnly]属性可以提升性能。 检查数据的依赖 在Unity的Profiler窗口中主线程中的WaitForJobGroup标签表明了Unity在等待一个工人线程上的job结束。这个标签可能意味着你以某种方式引入了一个资源依赖你需要去解决它。查找JobHandle.Complete来追踪你在什么地方有资源依赖导致主线程必须等待。 调试job job拥有一个Run方法你可以用它来替代Schedule从而让主线程立刻执行这个job。你可以使用它来达到调试目的。 不要在job中开辟托管内存 在job中开辟托管内存会难以置信得慢并且这个job不能利用Unity的Burst编译器来提升性能。Burst是一个新的基于LLVM的后端编译器技术它会使事情对于你更加简单。它获取C# job并利用你平台的特定功能产生高度优化的机器码。 更多信息 观看Unity GDC 2018: C# Job System的片段列表获取C# Job Syetem与ECS交互的更进一步信息查看ECS package documentation on GitHub
http://www.huolong8.cn/news/80378/

相关文章:

  • 做网站后期需要什么费用中国建设银行积分商城网站
  • 资讯类网站模板asp欧美跨境电商平台有哪些
  • 江西网站设计电话网站页面设计制作
  • 班级网站建设心得体会范文免费的排版软件
  • 网站建设企业合作邀请函广州10大网站开发
  • 浏览器怎么打开网站服务器连接互联网舆情信息
  • 百度网盘做存储网站wordpress阅读全文插件
  • 建设网站用外包模板可以上线吗华为网站建设目标
  • 凡客网站登陆有效的网络编址方案有
  • 电商网站创建的几个阶段外贸推广排行榜
  • 长沙建设信息网站做资金盘网站违法吗
  • 用jsp做的网站源代码下载兴宁房产网
  • 网站空间500m是什么系统学做网站
  • 个人网站备案的好处越秀区pc端网站建设
  • 重庆市城市建设档案馆网站网站开发中用什么安全性比性比较高
  • 心理咨询网站dede网站 地图什么做
  • 公司找人做网站需要什么网站建设方案书填写示例
  • 在线免费开网站上海网站seo优化
  • 企业网站备案名称要求书法网站模板下载
  • 建站工具华为wordpress tag 404
  • 建设网站要多少钱免费网络课程教学平台
  • 青岛网站建站团队承德做网站设计的
  • 金融公司网站制作老实人做网站
  • 制作网站平台拓普建站推广
  • 网络咨询网站游戏编程软件
  • wix网站建设网站建设推广人员
  • 销售网站建设的会计分录营销型企业网站有哪些平台
  • 拍婚纱照seo 优化 服务
  • 来个网站好人有好报wordpress站点管理员
  • wordpress素材下载源码郑州黑帽seo培训