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");
            {
                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();
        }