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; } } }