Нет описания
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

NativeQueueTests_InJobs.cs 5.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. using NUnit.Framework;
  2. using System.Collections.Generic;
  3. using Unity.Jobs;
  4. using Unity.Burst;
  5. using Unity.Collections;
  6. using Unity.Collections.Tests;
  7. using Assert = FastAssert;
  8. internal class NativeQueueTests_InJobs : CollectionsTestCommonBase
  9. {
  10. [BurstCompile(CompileSynchronously = true)]
  11. struct ConcurrentEnqueue : IJobParallelFor
  12. {
  13. public NativeQueue<int>.ParallelWriter queue;
  14. [NativeDisableParallelForRestriction]
  15. public NativeArray<int> result;
  16. public int StartIndex;
  17. public void Execute(int index)
  18. {
  19. index += StartIndex;
  20. result[index] = 1;
  21. queue.Enqueue(index);
  22. }
  23. }
  24. [Test]
  25. public void Enqueue()
  26. {
  27. const int queueSize = 100 * 1024;
  28. var queue = new NativeQueue<int>(CommonRwdAllocator.Handle);
  29. var writeStatus = CollectionHelper.CreateNativeArray<int>(queueSize, CommonRwdAllocator.Handle);
  30. var enqueueJob = new ConcurrentEnqueue()
  31. {
  32. queue = queue.AsParallelWriter(),
  33. result = writeStatus,
  34. StartIndex = 0,
  35. };
  36. var enqueue = enqueueJob.Schedule(queueSize, 1);
  37. enqueue.Complete();
  38. Assert.AreEqual(queueSize, queue.Count, "Job enqueued the wrong number of values");
  39. var allValues = new NativeHashSet<int>(queueSize, Allocator.Persistent);
  40. for (int i = 0; i < queueSize; ++i)
  41. {
  42. Assert.AreEqual(1, writeStatus[i], "Job failed to enqueue value");
  43. int enqueued = queue.Dequeue();
  44. Assert.IsTrue(enqueued >= 0 && enqueued < queueSize, "Job enqueued invalid value");
  45. Assert.IsTrue(allValues.Add(enqueued), "Job enqueued same value multiple times");
  46. }
  47. var disposeJob = queue.Dispose(enqueue);
  48. disposeJob.Complete();
  49. writeStatus.Dispose();
  50. allValues.Dispose();
  51. }
  52. [BurstCompile(CompileSynchronously = true)]
  53. struct EnqueueDequeueJob : IJob
  54. {
  55. public NativeQueue<int> queue;
  56. [ReadOnly] public NativeArray<int> arr;
  57. public int val;
  58. public void Execute()
  59. {
  60. for (int i = 0; i < 10000; ++i)
  61. {
  62. queue.Enqueue(0);
  63. val += arr[queue.Dequeue()];
  64. }
  65. }
  66. }
  67. [Test]
  68. public void EnqueueDequeueMultipleQueuesInMultipleJobs()
  69. {
  70. var handles = new NativeArray<JobHandle>(4, Allocator.Temp);
  71. for (int i = 0; i < 10; ++i)
  72. {
  73. var q1 = new NativeQueue<int>(CommonRwdAllocator.Handle);
  74. var q2 = new NativeQueue<int>(CommonRwdAllocator.Handle);
  75. var q3 = new NativeQueue<int>(CommonRwdAllocator.Handle);
  76. var q4 = new NativeQueue<int>(CommonRwdAllocator.Handle);
  77. var rangeCheck = CollectionHelper.CreateNativeArray<int>(1, CommonRwdAllocator.Handle);
  78. var j1 = new EnqueueDequeueJob {queue = q1, arr = rangeCheck, val = 0};
  79. var j2 = new EnqueueDequeueJob {queue = q2, arr = rangeCheck, val = 0};
  80. var j3 = new EnqueueDequeueJob {queue = q3, arr = rangeCheck, val = 0};
  81. var j4 = new EnqueueDequeueJob {queue = q4, arr = rangeCheck, val = 0};
  82. handles[0] = j1.Schedule();
  83. handles[1] = j2.Schedule();
  84. handles[2] = j3.Schedule();
  85. handles[3] = j4.Schedule();
  86. JobHandle.ScheduleBatchedJobs();
  87. JobHandle.CombineDependencies(handles).Complete();
  88. q1.Dispose();
  89. q2.Dispose();
  90. q3.Dispose();
  91. q4.Dispose();
  92. rangeCheck.Dispose();
  93. }
  94. handles.Dispose();
  95. }
  96. struct EnqueueJob : IJobParallelFor
  97. {
  98. public NativeQueue<int>.ParallelWriter Queue;
  99. public void Execute(int index)
  100. {
  101. Queue.Enqueue(index);
  102. }
  103. }
  104. [Test]
  105. public void ToArray_WorksFromJobs()
  106. {
  107. using (var queue = new NativeQueue<int>(CommonRwdAllocator.Handle))
  108. {
  109. new EnqueueJob
  110. {
  111. Queue = queue.AsParallelWriter()
  112. }.Schedule(100, 10).Complete();
  113. Assert.AreEqual(100, queue.Count);
  114. using (var arr = queue.ToArray(Allocator.Temp))
  115. {
  116. Assert.AreEqual(100, arr.Length);
  117. arr.Sort();
  118. for (int i = 0; i < arr.Length; i++)
  119. Assert.AreEqual(i, arr[i]);
  120. }
  121. }
  122. }
  123. [Test]
  124. public void NativeQueue_ParallelWriter()
  125. {
  126. const int queueSize = 100 * 1024;
  127. var queue = new NativeQueue<int>(CommonRwdAllocator.Handle);
  128. var writeStatus = CollectionHelper.CreateNativeArray<int>(queueSize, CommonRwdAllocator.Handle);
  129. var jobHandle = new ConcurrentEnqueue()
  130. {
  131. queue = queue.AsParallelWriter(),
  132. result = writeStatus,
  133. StartIndex = 0,
  134. }.Schedule(queueSize / 2, 1);
  135. jobHandle = new ConcurrentEnqueue()
  136. {
  137. queue = queue.AsParallelWriter(),
  138. result = writeStatus,
  139. StartIndex = queueSize / 2,
  140. }.Schedule(queueSize / 2, 1, jobHandle);
  141. jobHandle.Complete();
  142. Assert.AreEqual(queueSize, queue.Count, "Job enqueued the wrong number of values");
  143. var allValues = new NativeHashSet<int>(queueSize, Allocator.Persistent);
  144. for (int i = 0; i < queueSize; ++i)
  145. {
  146. Assert.AreEqual(1, writeStatus[i], "Job failed to enqueue value");
  147. int enqueued = queue.Dequeue();
  148. Assert.IsTrue(enqueued >= 0 && enqueued < queueSize, "Job enqueued invalid value");
  149. Assert.IsTrue(allValues.Add(enqueued), "Job enqueued same value multiple times");
  150. }
  151. var disposeJob = queue.Dispose(jobHandle);
  152. disposeJob.Complete();
  153. writeStatus.Dispose();
  154. allValues.Dispose();
  155. }
  156. }