Exemple #1
0
        public override bool Update(bool hasFocus)
        {
            m_ticks = MyPerformanceCounter.ElapsedTicks;
            m_frameCounter++;

            double secondsFromStart = MyPerformanceCounter.TicksToMs(m_ticks - m_startTime) / 1000;

            if (secondsFromStart > 1)
            {
                double updateLagOverMeasureTime = (secondsFromStart - m_frameCounter * VRage.Game.MyEngineConstants.UPDATE_STEP_SIZE_IN_SECONDS);
                m_updateLag = updateLagOverMeasureTime / secondsFromStart * 1000;

                m_startTime    = m_ticks;
                m_frameCounter = 0;

                if (Sync.Layer != null)
                {
                    m_sentLastSec     = (Sync.Layer.TransportLayer.ByteCountSent - m_lastSent) / secondsFromStart;
                    m_receivedLastSec = (Sync.Layer.TransportLayer.ByteCountReceived - m_lastReceived) / secondsFromStart;

                    m_lastReceived = Sync.Layer.TransportLayer.ByteCountReceived;
                    m_lastSent     = Sync.Layer.TransportLayer.ByteCountSent;
                }
            }

            Stats.Timing.Write("FPS", MyFpsManager.GetFps(), VRage.Stats.MyStatTypeEnum.CurrentValue, 0, 0);
            Stats.Timing.Increment("UPS", 1000);
            Stats.Timing.Write("Simulation speed", Sandbox.Engine.Physics.MyPhysics.SimulationRatio, VRage.Stats.MyStatTypeEnum.CurrentValue, 100, 2);
            Stats.Timing.Write("Server simulation speed", Sync.ServerSimulationRatio, VRage.Stats.MyStatTypeEnum.CurrentValue, 100, 2);
            Stats.Timing.WriteFormat("Frame time: {0} ms", MyFpsManager.FrameTime, VRage.Stats.MyStatTypeEnum.CurrentValue, 0, 1);
            Stats.Timing.WriteFormat("Frame avg time: {0} ms", MyFpsManager.FrameTimeAvg, VRage.Stats.MyStatTypeEnum.CurrentValue, 0, 1);
            Stats.Timing.WriteFormat("Frame min time: {0} ms", MyFpsManager.FrameTimeMin, VRage.Stats.MyStatTypeEnum.CurrentValue, 0, 1);
            Stats.Timing.WriteFormat("Frame max time: {0} ms", MyFpsManager.FrameTimeMax, VRage.Stats.MyStatTypeEnum.CurrentValue, 0, 1);
            Stats.Timing.Write("Update lag (per s)", (float)m_updateLag, VRage.Stats.MyStatTypeEnum.CurrentValue, 0, 4);
            Stats.Timing.Write("GC Memory", GC.GetTotalMemory(false), VRage.Stats.MyStatTypeEnum.CurrentValue, 0, 0);
#if !XB1
            Stats.Timing.Write("Process memory", WinApi.WorkingSet, VRage.Stats.MyStatTypeEnum.CurrentValue, 0, 0);
#endif // !XB1
            Stats.Timing.Write("Active parcticle effects", MyParticlesManager.ParticleEffectsForUpdate.Count, VRage.Stats.MyStatTypeEnum.CurrentValue, 0, 0);
            Stats.Timing.Write("Billboards total", VRageRender.MyPerformanceCounter.PerCameraDraw11Read.BillboardsDrawn, VRage.Stats.MyStatTypeEnum.CurrentValue, 0, 0);

            if (MyPhysics.GetClusterList() != null)
            {
                double i   = 0.0;
                double sum = 0.0;
                double max = 0.0;
                foreach (Havok.HkWorld havokWorld in MyPhysics.GetClusterList())
                {
                    i += 1.0;
                    var value = havokWorld.StepDuration.TotalMilliseconds;
                    sum += value;
                    if (value > max)
                    {
                        max = value;
                    }
                }
                Stats.Timing.WriteFormat("Physics worlds count: {0}", (float)i, VRage.Stats.MyStatTypeEnum.CurrentValue, 0, 0);
                Stats.Timing.WriteFormat("Physics step time (sum): {0} ms", (float)sum, VRage.Stats.MyStatTypeEnum.CurrentValue, 0, 1);
                Stats.Timing.WriteFormat("Physics step time (avg): {0} ms", (float)(sum / i), VRage.Stats.MyStatTypeEnum.CurrentValue, 0, 1);
                Stats.Timing.WriteFormat("Physics step time (max): {0} ms", (float)max, VRage.Stats.MyStatTypeEnum.CurrentValue, 0, 1);
            }

            if (Sync.Layer != null)
            {
                Stats.Timing.Write("Received KB/s", (float)m_receivedLastSec / 1024, VRage.Stats.MyStatTypeEnum.CurrentValue, 0, 2);
                Stats.Timing.Write("Sent KB/s", (float)m_sentLastSec / 1024, VRage.Stats.MyStatTypeEnum.CurrentValue, 0, 2);
            }

            return(base.Update(hasFocus));
        }
        public override void UpdateAfterSimulation()
        {
            base.UpdateAfterSimulation();

            m_rootIslands.Clear();
            m_rootEntityIslandIndex.Clear();

            var clusterList = MyPhysics.GetClusterList();

            if (clusterList != null)
            {
                foreach (Havok.HkWorld havokWorld in MyPhysics.GetClusterList())
                {
                    var islandCount = havokWorld.GetActiveSimulationIslandsCount();

                    for (int i = 0; i < islandCount; i++)
                    {
                        havokWorld.GetActiveSimulationIslandRigidBodies(i, m_rigidBodies);

                        HashSet <IMyEntity> island = null;

                        foreach (var rigidBody in m_rigidBodies)
                        {
                            var ents = rigidBody.GetAllEntities();
                            foreach (var entity in ents)
                            {
                                var topParent = entity.GetTopMostParent();

                                foreach (var rootIsland in m_rootIslands)
                                {
                                    if (rootIsland.RootEntities.Contains(topParent))
                                    {
                                        island = rootIsland.RootEntities;
                                        break;
                                    }
                                }
                            }
                            ents.Clear();
                        }

                        if (island == null)
                        {
                            IslandData islandData = new IslandData()
                            {
                                AABB           = BoundingBoxD.CreateInvalid(),
                                RootEntities   = new HashSet <IMyEntity>(),
                                ClientPriority = new Dictionary <ulong, float>()
                            };
                            island = islandData.RootEntities;
                            m_rootIslands.Add(islandData);
                        }

                        foreach (var rigidBody in m_rigidBodies)
                        {
                            var ents = rigidBody.GetAllEntities();
                            foreach (var entity in ents)
                            {
                                var topParent = entity.GetTopMostParent();
                                island.Add(topParent);
                            }
                            ents.Clear();
                        }

                        m_rigidBodies.Clear();
                    }
                }

                for (int i = 0; i < m_rootIslands.Count; i++)
                {
                    var islandData = m_rootIslands[i];
                    islandData.AABB = BoundingBoxD.CreateInvalid();

                    foreach (var entity in islandData.RootEntities)
                    {
                        islandData.AABB.Include(entity.PositionComp.WorldAABB);

                        m_rootEntityIslandIndex[entity] = i;
                    }

                    m_rootIslands[i] = islandData;
                }
            }
        }