当前位置:   article > 正文

Unity Entities --- JobComponentSystem中部分参数介绍_deallocateonjobcompletion

deallocateonjobcompletion

Unity Entities|0.2.0-preview.18

Unity Entities|官方文档

JobComponentSystem支持俩种类型的lambda表达式:

1. JobComponentSystem.Entities.ForEach(lambda)依赖于Entities,返回Entities集合通过lambda进行选择筛选

2.JobComponentSystem.Job.WithCode(lambda) 依赖于IJob且执行一次

然后呢俩种定义方式都可以通过Schedule()或者Run()方式进行运行。区别就是Run()是立即执行。

这里官方还介绍了来个关键之使用 ref 和 in。ref可以用来写更改数据,in用来只读数据的。

关于in的使用MSDN官网文档

Entities.ForEach example:

  1. class ApplyVelocitySystem : JobComponentSystem
  2. {
  3. protected override JobHandle OnUpdate(JobHandle inputDependencies)
  4. {
  5. var jobHandle = Entities
  6. .ForEach((ref Translation translation,
  7. in Velocity velocity) =>
  8. {
  9. translation.Value += velocity.Value;
  10. })
  11. .Schedule(inputDependencies);
  12. return jobHandle;
  13. }
  14. }

Job.WithCode example:

  1. public class RandomSumJob : JobComponentSystem
  2. {
  3. private uint seed = 1;
  4. protected override JobHandle OnUpdate(JobHandle inputDeps)
  5. {
  6. Random randomGen = new Random(seed++);
  7. NativeArray<float> randomNumbers
  8. = new NativeArray<float>(500, Allocator.TempJob);
  9. JobHandle generateNumbers = Job.WithCode(() =>
  10. {
  11. for (int i = 0; i < randomNumbers.Length; i++)
  12. {
  13. randomNumbers[i] = randomGen.NextFloat();
  14. }
  15. }).Schedule(inputDeps);
  16. NativeArray<float> result
  17. = new NativeArray<float>(1, Allocator.TempJob);
  18. JobHandle sumNumbers = Job.WithCode(() =>
  19. {
  20. for (int i = 0; i < randomNumbers.Length; i++)
  21. {
  22. result[0] += randomNumbers[i];
  23. }
  24. }).Schedule(generateNumbers);
  25. sumNumbers.Complete();
  26. UnityEngine.Debug.Log("The sum of "
  27. + randomNumbers.Length + " numbers is " + result[0]);
  28. randomNumbers.Dispose();
  29. result.Dispose();
  30. return sumNumbers;
  31. }
  32. }

关于Entities.ForEach的一些查询实体的方法:

这主要用于获取到执行Entities

WithAll<T>:查找含有T类型的component

WithAny<T,U>:同时查询多个不同类型的component,也可以只查询一个,作用等同于WithAll<T>

WithNone<T> :查询不包含有此类型组件

WithChangeFilter<T>:理解的意思感觉就是在块中☞之前修改过的数据的component

WithSharedComponentFilter :顾名思义就是选择是shared component的

WithStoreEntityQueryInField :存储查询到的Entities可以进行一些查询操作

这里官方也有一个很重要的Tips:

WithNone<T> 使用不注意可能会和WithAll<T>以及WithAny<T,U>引起冲突。这里注意一下好了。

使用举例:

  1. return Entities.WithAll<LocalToWorld>()
  2. .WithAny<Rotation, Translation, Scale>()
  3. .WithNone<LocalToParent>()
  4. .ForEach((ref Destination outputData,
  5. in Source inputData) =>
  6. {
  7. /* do some work */
  8. })
  9. .Schedule(inputDeps);

EntityQuery 使用举例:

  1. private EntityQuery query;
  2. protected override JobHandle OnUpdate(JobHandle inputDeps)
  3. {
  4. int dataCount = query.CalculateEntityCount();
  5. NativeArray<float> dataSquared
  6. = new NativeArray<float>(dataCount, Allocator.Temp);
  7. JobHandle GetSquaredValues = Entities
  8. .WithStoreEntityQueryInField(ref query)
  9. .ForEach((int entityInQueryIndex, in Data data) =>
  10. {
  11. dataSquared[entityInQueryIndex] = data.Value * data.Value;
  12. })
  13. .Schedule(inputDeps);
  14. return Job
  15. .WithCode(() =>
  16. {
  17. //Use dataSquared array...
  18. var v = dataSquared[dataSquared.Length -1];
  19. })
  20. .WithDeallocateOnJobCompletion(dataSquared)
  21. .Schedule(GetSquaredValues);
  22. }

Shared component 使用示例:

  1. public class ColorCycleJob : JobComponentSystem
  2. {
  3. protected override JobHandle OnUpdate(JobHandle inputDeps)
  4. {
  5. List<Cohort> cohorts = new List<Cohort>();
  6. EntityManager.GetAllUniqueSharedComponentData<Cohort>(cohorts);
  7. NativeList<JobHandle> dependencies
  8. = new NativeList<JobHandle>();
  9. foreach (Cohort cohort in cohorts)
  10. {
  11. DisplayColor newColor = ColorTable.GetNextColor(cohort.Value);
  12. JobHandle thisJobHandle
  13. = Entities.WithSharedComponentFilter(cohort)
  14. .ForEach((ref DisplayColor color) => { color = newColor; })
  15. .Schedule(inputDeps);
  16. dependencies.Add(thisJobHandle);
  17. }
  18. return JobHandle.CombineDependencies(dependencies);
  19. }
  20. }

捕获之后参数方法:

这主要用于获取到Entities执行完lambda之后进行的一些参数设置

WithReadOnly(myvar):改变获取到的数据访问限制给成只读

WithDeallocateOnJobCompletion(myvar):完成操作之后释放本容器

WithNativeDisableParallelForRestriction(myvar):官方说法挺晦涩,感觉说人话就是可以允许多个线程访问本组数据,但是可能会额外消耗一点性能

WithNativeDisableContainerSafetyRestriction(myvar):这个官方大体的意思感觉就是关闭多线程访问保护你们尽管来,不要命的一种操作

WithNativeDisableUnsafePtrRestrictionAttribute(myvar):理解起来太头疼了(官方直译:允许您使用本机容器提供的不安全指针。不正确的指针使用可能导致应用程序中出现细微的错误、不稳定和崩溃

Job options介绍:

JobHandle Schedule(JobHandle):

    Entities.ForEach 中:可以并行执行在线程上执行lambda函数

     Job.WithCode 中:执行一个单独的实例在后台线程中

void Run():

  Entities.ForEach 中:执行一次lambda操作,不接受参数,也不返回参数

      Job.WithCode 中:执行一次

WithBurst(FloatMode, FloatPrecision, bool):设置Brust编译器信息:

  floatMode :浮点数优化模式,快速模式速度快但是也可能产生不必要的错误

       floatPrecision :设置浮点数学精度

         synchronousCompilation:立即编译该函数,而不是调度该函数以供以后编译。

WithoutBurst():禁止使用Brust编译器

WithStructuralChanges() :在主线程上执行lambda函数并禁用Burst,以便可以对函数中的实体数据进行结构更改。为了获得更好的性能,可以使用一个并发的EntityCommandBuffer

WithName(string):将指定的字符串指定为生成的作业类的名称。指定名称是可选的,但可以帮助在调试和分析时识别函数。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/112409
推荐阅读
相关标签
  

闽ICP备14008679号