private void NewMethod(FrozenRenderSceneTag tag, NativeArray <ArchetypeChunk> chunks,
                               NativeArray <int> sharedRendererCounts,
                               NativeArray <int> sortedChunkIndices, int sharedRenderCount,
                               ArchetypeChunkComponentType <RenderMeshFlippedWindingTag> meshInstanceFlippedTagType,
                               ArchetypeChunkSharedComponentType <EditorRenderData> editorRenderDataType,
                               ArchetypeChunkSharedComponentType <RenderMesh> RenderMeshType)
        {
            var job = new BatchingJob()
            {
                NativeEditorRenderDataIndex = new NativeList <int>(Allocator.TempJob),
                NativeDataArray1            = new NativeList <int4>(Allocator.TempJob),
                NativeFlipped        = new NativeList <bool>(Allocator.TempJob),
                SharedRendererCounts = sharedRendererCounts,
                SortedChunkIndices   = sortedChunkIndices,
                Chunks                     = chunks,
                SharedRenderCount          = sharedRenderCount,
                MeshInstanceFlippedTagType = meshInstanceFlippedTagType,
                EditorRenderDataType       = editorRenderDataType,
                RenderMeshType             = RenderMeshType
            };

            job.Run();

            for (int i = 0; i < job.NativeDataArray1.Length; i++)
            {
                var editorDataIndex = job.NativeEditorRenderDataIndex[i];
                EditorRenderData editorRenderData = m_DefaultEditorRenderData;

                if (editorDataIndex != -1)
                {
                    editorRenderData = EntityManager.GetSharedComponentData <EditorRenderData>(editorDataIndex);
                }

                var data1 = job.NativeDataArray1[i];

                m_InstancedRenderMeshBatchGroup.AddBatch(tag, data1.x,
                                                         data1.z, chunks, sortedChunkIndices, data1.y,
                                                         data1.w, job.NativeFlipped[i],
                                                         editorRenderData);
            }

            job.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");
            {
                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();
        }
        private void OldMethod(FrozenRenderSceneTag tag, NativeArray <ArchetypeChunk> chunks,
                               NativeArray <int> sharedRendererCounts,
                               NativeArray <int> sortedChunkIndices, int sharedRenderCount,
                               ArchetypeChunkComponentType <RenderMeshFlippedWindingTag> meshInstanceFlippedTagType,
                               ArchetypeChunkSharedComponentType <EditorRenderData> editorRenderDataType,
                               ArchetypeChunkSharedComponentType <RenderMesh> RenderMeshType)
        {
            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);
                }
            }
        }