private void SortSystemUpdateList2() { if (!m_systemSortDirty) { return; } if (UseLegacySortOrder) { throw new InvalidOperationException("UseLegacySortOrder must be false to use the updated sorting API"); } RemovePending(); // Build three lists of systems var elems = new List <ComponentSystemSorter.SystemElement>[3] { new List <ComponentSystemSorter.SystemElement>(4), new List <ComponentSystemSorter.SystemElement>(m_systemsToUpdate.Count + m_UnmanagedSystemsToUpdate.Length), new List <ComponentSystemSorter.SystemElement>(4), }; var ourType = GetType(); for (int i = 0; i < m_systemsToUpdate.Count; ++i) { var system = m_systemsToUpdate[i]; var sysType = system.GetType(); // Take order first/last ordering into account int ordering = ComputeSystemOrdering(sysType, ourType); elems[ordering].Add(new ComponentSystemSorter.SystemElement { Index = new UpdateIndex(i, true), Type = sysType }); } for (int i = 0; i < m_UnmanagedSystemsToUpdate.Length; ++i) { var sysType = World.GetTypeOfUnmanagedSystem(m_UnmanagedSystemsToUpdate[i]); int ordering = ComputeSystemOrdering(sysType, ourType); elems[ordering].Add(new ComponentSystemSorter.SystemElement { Index = new UpdateIndex(i, false), Type = sysType }); } // Perform the sort for each bucket. for (int i = 0; i < 3; ++i) { if (elems[i].Count > 0) { ComponentSystemSorter.Sort(elems[i], ourType); } } // Because people can freely look at the list of managed systems, we need to put that part of list in order. var oldSystems = m_systemsToUpdate; m_systemsToUpdate = new List <ComponentSystemBase>(oldSystems.Count); for (int i = 0; i < 3; ++i) { foreach (var e in elems[i]) { var index = e.Index; if (index.IsManaged) { m_systemsToUpdate.Add(oldSystems[index.Index]); } } } // Commit results to master update list m_MasterUpdateList.Clear(); m_MasterUpdateList.SetCapacity(elems[0].Count + elems[1].Count + elems[2].Count); // Append buckets in order, but replace managed indicies with incrementinging indices // into the newly sorted m_systemsToUpdate list int managedIndex = 0; for (int i = 0; i < 3; ++i) { foreach (var e in elems[i]) { if (e.Index.IsManaged) { m_MasterUpdateList.Add(new UpdateIndex(managedIndex++, true)); } else { m_MasterUpdateList.Add(e.Index); } } } m_systemSortDirty = false; foreach (var sys in m_systemsToUpdate) { if (TypeManager.IsSystemAGroup(sys.GetType())) { RecurseUpdate((ComponentSystemGroup)sys); } } }
private void RecurseUpdate(ComponentSystemGroup group) { if (!m_systemSortDirty) { return; } RemovePending(); var groupType = GetType(); var allElems = new ComponentSystemSorter.SystemElement[m_systemsToUpdate.Count + m_UnmanagedSystemsToUpdate.Length]; var systemsPerBucket = new int[3]; for (int i = 0; i < m_systemsToUpdate.Count; ++i) { var system = m_systemsToUpdate[i]; var sysType = system.GetType(); int orderingBucket = ComputeSystemOrdering(sysType, groupType); allElems[i] = new ComponentSystemSorter.SystemElement { Type = sysType, Index = new UpdateIndex(i, true), OrderingBucket = orderingBucket, updateBefore = new List <Type>(), nAfter = 0, }; systemsPerBucket[orderingBucket]++; } for (int i = 0; i < m_UnmanagedSystemsToUpdate.Length; ++i) { var sysType = World.GetTypeOfUnmanagedSystem(m_UnmanagedSystemsToUpdate[i]); int orderingBucket = ComputeSystemOrdering(sysType, groupType); allElems[m_systemsToUpdate.Count + i] = new ComponentSystemSorter.SystemElement { Type = sysType, Index = new UpdateIndex(i, false), OrderingBucket = orderingBucket, updateBefore = new List <Type>(), nAfter = 0, }; systemsPerBucket[orderingBucket]++; } // Find & validate constraints between systems in the group ComponentSystemSorter.FindConstraints(groupType, allElems); // Build three lists of systems var elemBuckets = new [] { new ComponentSystemSorter.SystemElement[systemsPerBucket[0]], new ComponentSystemSorter.SystemElement[systemsPerBucket[1]], new ComponentSystemSorter.SystemElement[systemsPerBucket[2]], }; var nextBucketIndex = new int[3]; for (int i = 0; i < allElems.Length; ++i) { int bucket = allElems[i].OrderingBucket; int index = nextBucketIndex[bucket]++; elemBuckets[bucket][index] = allElems[i]; } // Perform the sort for each bucket. for (int i = 0; i < 3; ++i) { if (elemBuckets[i].Length > 0) { ComponentSystemSorter.Sort(elemBuckets[i]); } } // Because people can freely look at the list of managed systems, we need to put that part of list in order. var oldSystems = m_systemsToUpdate; m_systemsToUpdate = new List <ComponentSystemBase>(oldSystems.Count); for (int i = 0; i < 3; ++i) { foreach (var e in elemBuckets[i]) { var index = e.Index; if (index.IsManaged) { m_systemsToUpdate.Add(oldSystems[index.Index]); } } } // Commit results to master update list m_MasterUpdateList.Clear(); m_MasterUpdateList.SetCapacity(allElems.Length); // Append buckets in order, but replace managed indices with incrementing indices // into the newly sorted m_systemsToUpdate list int managedIndex = 0; for (int i = 0; i < 3; ++i) { foreach (var e in elemBuckets[i]) { if (e.Index.IsManaged) { m_MasterUpdateList.Add(new UpdateIndex(managedIndex++, true)); } else { m_MasterUpdateList.Add(e.Index); } } } m_systemSortDirty = false; foreach (var sys in m_systemsToUpdate) { if (TypeManager.IsSystemAGroup(sys.GetType())) { RecurseUpdate((ComponentSystemGroup)sys); } } }