説明なし
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

NativeQueueTests_InJobs.cs 6.5KB

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