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 NativeArraySharedInt(source, Allocator.TempJob); var sharedValuesJobHandle = sharedValues.Schedule(default(JobHandle)); sharedValuesJobHandle.Complete(); var sharedValueCount = sharedValues.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]]); Assert.AreEqual(4, sharedValueCount); 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 NativeArraySharedInt(Source, Allocator.TempJob); var sharedValuesJobHandle = SharedValues.Schedule(default(JobHandle)); sharedValuesJobHandle.Complete(); }
public void CacheMeshBatchRendererGroup(FrozenRenderSceneTag tag, NativeArray <ArchetypeChunk> chunks, int chunkCount) { var RenderMeshType = GetSharedComponentTypeHandle <RenderMesh>(); var meshInstanceFlippedTagType = GetComponentTypeHandle <RenderMeshFlippedWindingTag>(); var editorRenderDataType = GetSharedComponentTypeHandle <EditorRenderData>(); Profiler.BeginSample("Sort Shared Renderers"); var chunkRenderer = new NativeArray <int>(chunkCount, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); var sortedChunks = new NativeArraySharedInt(chunkRenderer, Allocator.TempJob); var gatherChunkRenderersJob = new GatherChunkRenderers { Chunks = chunks, RenderMeshTypeHandle = 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(); }