当前位置: 首页 > 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://wiki.neutronadmin.com/news/80378/

相关文章:

  • 响应式 网站建设创建电子商务网站的7个步骤
  • wordpress游戏网站模板企业展厅建设计划书
  • 庆阳定制网站网站的后期维护自己怎么做
  • 工程建设网站自己电脑怎样做网站
  • 用服务器ip做网站页面简单响应式网站设计代码
  • 个人网站开发可行性报告网站seo诊断湖南岚鸿
  • 苏州高端模板建站广东省监理建设协会网站
  • 做一个网站的基本步骤强大的网站
  • 深圳教育网站设计公司深圳管控最新消息
  • 建站服务网络公司东丽做网站
  • 手机网站图片锚链接怎么做网络营销效果评估的作用有哪些
  • 游戏软件网站开发网址一键生成app免费
  • 站外推广营销方案wordpress清除所有评论
  • 网站建设及服务合同apache fastcgi wordpress
  • 做网站做手机站还是自适应站自己怎么做网站网页
  • 禁止拿我们的网站做宣传青岛易龙网站建设
  • 烟台h5网站制作公司wordpress最常用水印
  • 如何创建设计个人网站seo外链的常见措施
  • 登录功能网站怎么做织梦网站制作费用
  • 网站建设教程免费湖南岚鸿wordpress tagline
  • 郑州专业网站设计公司地址移动互联和网站开发哪个好
  • 目前网站软件wordpress 挂件
  • 云南网站制作报价适合0基础网站开发软件
  • 古风网站建设文字图片一键生成器
  • 上海网站推广优化公司国外服务器ip大全
  • 更改网站主题江苏提升关键词排名收费
  • 优化网站技术汶上做网站
  • 周口市做网站h5游戏网站建设
  • title 网站建设广州10大网站开发
  • 做网站要会写什么软件网站建设项目需求说明