float GetAverageRunningTime(SystemHandle systemHandle, SystemHandle parentSystemHandle)
        {
            if (systemHandle.Managed != null && systemHandle.Managed is ComponentSystemGroup systemGroup)
            {
                if (systemGroup.Systems != null)
                {
                    var managedChildSystemsSum = systemGroup.Systems.Sum(child => GetAverageRunningTime(child, systemGroup));

                    // unmanaged system
                    var unmanagedChildSystems   = systemGroup.UnmanagedSystems;
                    var unmanagedChildSystemSum = 0.0f;
                    for (var i = 0; i < unmanagedChildSystems.length; i++)
                    {
                        unmanagedChildSystemSum += GetAverageRunningTime(new SystemHandle(unmanagedChildSystems[i], systemGroup.World), systemGroup);
                    }

                    return(managedChildSystemsSum + unmanagedChildSystemSum);
                }
            }
            else
            {
                var recorderKey = new PlayerLoopSystemGraph.RecorderKey
                {
                    World        = systemHandle.World,
                    Group        = parentSystemHandle.Managed as ComponentSystemGroup,
                    SystemHandle = systemHandle
                };

                return(Graph.RecordersBySystem.TryGetValue(recorderKey, out var recorder) ? recorder.ReadMilliseconds() : 0.0f);
            }

            return(-1);
        }
        static void Parse(SystemHandle systemHandle, PlayerLoopSystemGraph graph, IPlayerLoopNode parent = null)
        {
            IPlayerLoopNode node;

            graph.AllSystems.Add(systemHandle);

            if (systemHandle.Managed != null && systemHandle.Managed is ComponentSystemGroup group)
            {
                var groupNode = Pool <ComponentGroupNode> .GetPooled();

                groupNode.Value = group;
                node            = groupNode;

                ref var updateSystemList = ref group.m_MasterUpdateList;
                for (int i = 0, count = updateSystemList.length; i < count; ++i)
                {
                    var updateIndex = updateSystemList[i];
                    if (updateIndex.IsManaged)
                    {
                        var child = group.Systems[updateIndex.Index];
                        Parse(child, graph, node);
                    }
                    else
                    {
                        var child = group.UnmanagedSystems[updateIndex.Index];
                        Parse(new SystemHandle(child, group.World), graph, node);
                    }
                }
            }
        public SystemForSearch(SystemHandle systemHandle)
        {
            SystemHandle = systemHandle;
            var systemType = systemHandle.GetSystemType();

            SystemName = Properties.Editor.TypeUtility.GetTypeDisplayName(systemType).Replace(".", "|");
            m_ComponentNamesInQueryCache = EntityQueryUtility.CollectComponentTypesFromSystemQuery(SystemHandle).ToArray();
        }
Exemplo n.º 4
0
        public static unsafe IEnumerable <string> CollectComponentTypesFromSystemQuery(SystemHandle systemHandle)
        {
            if (systemHandle == null || !systemHandle.Valid)
            {
                return(Enumerable.Empty <string>());
            }
            ;

            using (var hashPool = PooledHashSet <string> .Make())
            {
                var hashset = hashPool.Set;

                var ptr = systemHandle.StatePointer;
                if (ptr != null && ptr->EntityQueries.length > 0)
                {
                    var queries = ptr->EntityQueries;
                    for (var i = 0; i < queries.length; i++)
                    {
                        using (var queryTypeList = queries[i].GetQueryTypes().ToPooledList())
                        {
                            foreach (var name in queryTypeList.List.Select(queryType => SpecifiedTypeName(queryType.GetManagedType())))
                            {
                                hashset.Add(name);
                            }
                        }
                    }
                }

                return(hashset.ToArray());
            }
        }