コード例 #1
0
        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();
        }
コード例 #2
0
        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();
        }
コード例 #3
0
        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();
        }
コード例 #4
0
        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();
        }
コード例 #5
0
        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();
        }
コード例 #6
0
        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();
        }
コード例 #7
0
        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();
        }
コード例 #8
0
        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);
        }