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