Mirror of Svelto.ECS because we're a fan of it
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

JobifiedEnginesGroup.cs 3.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #if UNITY_2019_2_OR_NEWER
  2. using Svelto.Common;
  3. using Svelto.DataStructures;
  4. using Unity.Jobs;
  5. namespace Svelto.ECS.Extensions.Unity
  6. {
  7. public interface IJobifiedEngine : IEngine
  8. {
  9. JobHandle Execute(JobHandle inputDeps);
  10. string name { get; }
  11. }
  12. public interface IJobifiedEngine<T> : IEngine
  13. {
  14. JobHandle Execute(JobHandle inputDeps, ref T _param);
  15. string name { get; }
  16. }
  17. public interface IJobifiedGroupEngine<T> : IJobifiedEngine<T>
  18. { }
  19. /// <summary>
  20. /// Note unsorted jobs run in parallel
  21. /// </summary>
  22. /// <typeparam name="Interface"></typeparam>
  23. public abstract class JobifiedEnginesGroup<Interface>:IJobifiedEngine where Interface : class, IJobifiedEngine
  24. {
  25. protected JobifiedEnginesGroup(FasterList<Interface> engines)
  26. {
  27. _name = "JobifiedEnginesGroup - "+this.GetType().Name;
  28. _engines = engines;
  29. }
  30. protected JobifiedEnginesGroup()
  31. {
  32. _name = "JobifiedEnginesGroup - "+this.GetType().Name;
  33. _engines = new FasterList<Interface>();
  34. }
  35. public JobHandle Execute(JobHandle inputHandles)
  36. {
  37. var engines = _engines;
  38. JobHandle combinedHandles = inputHandles;
  39. using (var profiler = new PlatformProfiler(_name))
  40. {
  41. for (var index = 0; index < engines.count; index++)
  42. {
  43. ref var engine = ref engines[index];
  44. using (profiler.Sample(engine.name))
  45. {
  46. combinedHandles = engine.Execute(inputHandles);
  47. }
  48. }
  49. }
  50. return combinedHandles;
  51. }
  52. protected internal void Add(Interface engine)
  53. {
  54. _engines.Add(engine);
  55. }
  56. public string name => _name;
  57. protected readonly FasterList<Interface> _engines;
  58. readonly string _name;
  59. }
  60. public abstract class JobifiedEnginesGroup<Interface, Param>: IJobifiedGroupEngine<Param> where Interface : class, IJobifiedEngine<Param>
  61. {
  62. protected JobifiedEnginesGroup(FasterList<Interface> engines)
  63. {
  64. _name = "JobifiedEnginesGroup - "+this.GetType().Name;
  65. _engines = engines;
  66. }
  67. public JobHandle Execute(JobHandle combinedHandles, ref Param _param)
  68. {
  69. var engines = _engines;
  70. using (var profiler = new PlatformProfiler(_name))
  71. {
  72. for (var index = 0; index < engines.count; index++)
  73. {
  74. var engine = engines[index];
  75. using (profiler.Sample(engine.name)) combinedHandles = engine.Execute(combinedHandles, ref _param);
  76. }
  77. }
  78. return combinedHandles;
  79. }
  80. public string name => _name;
  81. readonly string _name;
  82. readonly FasterReadOnlyList<Interface> _engines;
  83. }
  84. }
  85. #endif