public void NativeArraySharedValuesFoundAllValues() { int count = 1024 + 1023; var source = new NativeArray <int>(count, Allocator.Temp); for (int i = 0; i < count; i++) { source[i] = count - (i / 2); } var sharedValues = new NativeArraySharedValues <int>(source, Allocator.Temp); var sharedValuesJobHandle = sharedValues.Schedule(default(JobHandle)); sharedValuesJobHandle.Complete(); var sortedIndices = sharedValues.GetSortedIndices(); for (int i = 0; i < count; i++) { var foundValue = false; for (int j = 0; j < sortedIndices.Length; j++) { if (sortedIndices[j] == i) { foundValue = true; break; } } Assert.AreEqual(true, foundValue); } sharedValues.Dispose(); source.Dispose(); }
public void NativeArraySharedValuesSameValues() { int count = 1024 + 1023; var source = new NativeArray <int>(count, Allocator.Temp); for (int i = 0; i < count; i++) { source[i] = count - (i / 2); } var sharedValues = new NativeArraySharedValues <int>(source, Allocator.Temp); var sharedValuesJobHandle = sharedValues.Schedule(default(JobHandle)); sharedValuesJobHandle.Complete(); for (int i = 0; i < count; i++) { var sharedValueIndices = sharedValues.GetSharedValueIndicesBySourceIndex(i); var sourceValue = source[i]; Assert.GreaterOrEqual(sharedValueIndices.Length, 1); for (int j = 0; j < sharedValueIndices.Length; j++) { var otherIndex = sharedValueIndices[j]; var otherValue = source[otherIndex]; Assert.AreEqual(sourceValue, otherValue); } } sharedValues.Dispose(); source.Dispose(); }
public void NativeArraySharedValuesResultInOrderLargeRemainder() { int count = 1024 + 1023; var source = new NativeArray <int>(count, Allocator.Temp); for (int i = 0; i < count; i++) { source[i] = count - (i / 2); } var sharedValues = new NativeArraySharedValues <int>(source, Allocator.Temp); var sharedValuesJobHandle = sharedValues.Schedule(default(JobHandle)); sharedValuesJobHandle.Complete(); var sortedIndices = sharedValues.GetSortedIndices(); var lastIndex = sortedIndices[0]; var lastValue = source[lastIndex]; for (int i = 1; i < count; i++) { var index = sortedIndices[i]; var value = source[index]; Assert.GreaterOrEqual(value, lastValue); lastIndex = index; lastValue = value; } sharedValues.Dispose(); source.Dispose(); }
public void NASV_FoundAllSharedValues() { int count = 1024 + 1023; var source = new NativeArray <int>(count, Allocator.TempJob); for (int i = 0; i < count; i++) { source[i] = i % 4; } var sharedValues = new NativeArraySharedValues <int>(source, Allocator.TempJob); var sharedValuesJobHandle = sharedValues.Schedule(default(JobHandle)); sharedValuesJobHandle.Complete(); var sharedValueCount = sharedValues.SharedValueCount; Assert.AreEqual(4, sharedValueCount); var sharedIndexArray = sharedValues.GetSharedIndexArray(); Assert.AreEqual(0, source[sharedIndexArray[0]]); Assert.AreEqual(1, source[sharedIndexArray[1]]); Assert.AreEqual(2, source[sharedIndexArray[2]]); Assert.AreEqual(3, source[sharedIndexArray[3]]); sharedValues.Dispose(); source.Dispose(); }
void PrepareAllSame(int count) { Source = new NativeArray <int>(count, Allocator.TempJob); for (int i = 0; i < count; i++) { Source[i] = 71; } SharedValues = new NativeArraySharedValues <int>(Source, Allocator.TempJob); var sharedValuesJobHandle = SharedValues.Schedule(default(JobHandle)); sharedValuesJobHandle.Complete(); }
public void CacheMeshBatchRendererGroup(FrozenRenderSceneTag tag, NativeArray <ArchetypeChunk> chunks, int chunkCount) { var RenderMeshType = GetArchetypeChunkSharedComponentType <RenderMesh>(); var meshInstanceFlippedTagType = GetArchetypeChunkComponentType <RenderMeshFlippedWindingTag>(); var editorRenderDataType = GetArchetypeChunkSharedComponentType <EditorRenderData>(); Profiler.BeginSample("Sort Shared Renderers"); var chunkRenderer = new NativeArray <int>(chunkCount, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); var sortedChunks = new NativeArraySharedValues <int>(chunkRenderer, Allocator.TempJob); var gatherChunkRenderersJob = new GatherChunkRenderers { Chunks = chunks, RenderMeshType = RenderMeshType, ChunkRenderer = chunkRenderer }; var gatherChunkRenderersJobHandle = gatherChunkRenderersJob.Schedule(chunkCount, 64); var sortedChunksJobHandle = sortedChunks.Schedule(gatherChunkRenderersJobHandle); sortedChunksJobHandle.Complete(); Profiler.EndSample(); var sharedRenderCount = sortedChunks.SharedValueCount; var sharedRendererCounts = sortedChunks.GetSharedValueIndexCountArray(); var sortedChunkIndices = sortedChunks.GetSortedIndices(); m_InstancedRenderMeshBatchGroup.BeginBatchGroup(); Profiler.BeginSample("Add New Batches"); { NewMethod(tag, chunks, sharedRendererCounts, sortedChunkIndices, sharedRenderCount, meshInstanceFlippedTagType, editorRenderDataType, RenderMeshType); //OldMethod(tag, chunks, sharedRendererCounts, sortedChunkIndices, sharedRenderCount, meshInstanceFlippedTagType, editorRenderDataType, RenderMeshType); } Profiler.EndSample(); m_InstancedRenderMeshBatchGroup.EndBatchGroup(tag, chunks, sortedChunkIndices); chunkRenderer.Dispose(); sortedChunks.Dispose(); }
public void CacheMeshBatchRendererGroup(FrozenRenderSceneTag tag, NativeArray <ArchetypeChunk> chunks, int chunkCount) { var RenderMeshType = GetArchetypeChunkSharedComponentType <RenderMesh>(); var meshInstanceFlippedTagType = GetArchetypeChunkComponentType <RenderMeshFlippedWindingTag>(); var editorRenderDataType = GetArchetypeChunkSharedComponentType <EditorRenderData>(); Profiler.BeginSample("Sort Shared Renderers"); var chunkRenderer = new NativeArray <int>(chunkCount, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); var sortedChunks = new NativeArraySharedValues <int>(chunkRenderer, Allocator.TempJob); var gatherChunkRenderersJob = new GatherChunkRenderers { Chunks = chunks, RenderMeshType = RenderMeshType, ChunkRenderer = chunkRenderer }; var gatherChunkRenderersJobHandle = gatherChunkRenderersJob.Schedule(chunkCount, 64); var sortedChunksJobHandle = sortedChunks.Schedule(gatherChunkRenderersJobHandle); sortedChunksJobHandle.Complete(); Profiler.EndSample(); var sharedRenderCount = sortedChunks.SharedValueCount; var sharedRendererCounts = sortedChunks.GetSharedValueIndexCountArray(); var sortedChunkIndices = sortedChunks.GetSortedIndices(); m_InstancedRenderMeshBatchGroup.BeginBatchGroup(); Profiler.BeginSample("Add New Batches"); { var sortedChunkIndex = 0; for (int i = 0; i < sharedRenderCount; i++) { var startSortedChunkIndex = sortedChunkIndex; var endSortedChunkIndex = startSortedChunkIndex + sharedRendererCounts[i]; while (sortedChunkIndex < endSortedChunkIndex) { var chunkIndex = sortedChunkIndices[sortedChunkIndex]; var chunk = chunks[chunkIndex]; var rendererSharedComponentIndex = chunk.GetSharedComponentIndex(RenderMeshType); var editorRenderDataIndex = chunk.GetSharedComponentIndex(editorRenderDataType); var editorRenderData = m_DefaultEditorRenderData; if (editorRenderDataIndex != -1) { editorRenderData = EntityManager.GetSharedComponentData <EditorRenderData>(editorRenderDataIndex); } var remainingEntitySlots = 1023; var flippedWinding = chunk.Has(meshInstanceFlippedTagType); int instanceCount = chunk.Count; int startSortedIndex = sortedChunkIndex; int batchChunkCount = 1; remainingEntitySlots -= chunk.Count; sortedChunkIndex++; while (remainingEntitySlots > 0) { if (sortedChunkIndex >= endSortedChunkIndex) { break; } var nextChunkIndex = sortedChunkIndices[sortedChunkIndex]; var nextChunk = chunks[nextChunkIndex]; if (nextChunk.Count > remainingEntitySlots) { break; } var nextFlippedWinding = nextChunk.Has(meshInstanceFlippedTagType); if (nextFlippedWinding != flippedWinding) { break; } #if UNITY_EDITOR if (editorRenderDataIndex != nextChunk.GetSharedComponentIndex(editorRenderDataType)) { break; } #endif remainingEntitySlots -= nextChunk.Count; instanceCount += nextChunk.Count; batchChunkCount++; sortedChunkIndex++; } m_InstancedRenderMeshBatchGroup.AddBatch(tag, rendererSharedComponentIndex, instanceCount, chunks, sortedChunkIndices, startSortedIndex, batchChunkCount, flippedWinding, editorRenderData); } } } Profiler.EndSample(); m_InstancedRenderMeshBatchGroup.EndBatchGroup(tag, chunks, sortedChunkIndices); chunkRenderer.Dispose(); sortedChunks.Dispose(); }
protected override JobHandle OnUpdate(JobHandle jobHandle) { if (entityQuery.IsEmptyIgnoreFilter) { return(jobHandle); } var chunkCount = entityQuery.CalculateChunkCount(); using (var meshRenderIndexes = new NativeArray <int>(chunkCount, Allocator.TempJob, NativeArrayOptions.UninitializedMemory)) using (var sortedSharedIndexes = new NativeArraySharedValues <int>(meshRenderIndexes, Allocator.TempJob)) { Profiler.BeginSample("Sort Shared RenderMesh"); { jobHandle = new FillSharedIndexInChunkJob <RenderMesh> { sharedType = GetArchetypeChunkSharedComponentType <RenderMesh>(), sharedIndexesInChunk = meshRenderIndexes }.Schedule(entityQuery, jobHandle); jobHandle = sortedSharedIndexes.Schedule(jobHandle); jobHandle.Complete(); } Profiler.EndSample(); Profiler.BeginSample("Prepare & Set FameOffset"); { var sharedRenderCount = sortedSharedIndexes.SharedValueCount; for (var i = 0; i < sharedRenderCount; ++i) { var sharedValueIndices = sortedSharedIndexes.GetSharedValueIndicesBySharedIndex(i); if (sharedValueIndices.Length == 0) { continue; } var renderMesh = EntityManager.GetSharedComponentData <RenderMesh>(meshRenderIndexes[sharedValueIndices[0]]); var renderMeshKey = AnimUtils.ToHash128(ref renderMesh); if (!properties.ContainsKey(renderMeshKey)) { properties.Add(renderMeshKey, new PropertyData(1024)); } var arrayData = properties[renderMeshKey]; Profiler.BeginSample("Set FameOffset"); arrayData.SetData(renderMesh.material); Profiler.EndSample(); Profiler.BeginSample("Prepare FameOffset"); entityQuery.SetSharedComponentFilter(renderMesh); jobHandle = arrayData.Schedule(entityQuery, this, jobHandle); entityQuery.ResetFilter(); Profiler.EndSample(); } } Profiler.EndSample(); } return(jobHandle); }