void DrawStats() { var samplesPerSecond = 1.0f / m_StatsDeltaTime.average; int y = 2; Overlay.Managed.Write(2, y++, " tick rate: {0}", m_NetworkClient.serverTickRate); Overlay.Managed.Write(2, y++, " frame timescale: {0}", m_FrameTimeScale); Overlay.Managed.Write(2, y++, " sim : {0:0.0} / {1:0.0} / {2:0.0} ({3:0.0})", m_ServerSimTime.min, m_ServerSimTime.min, m_ServerSimTime.max, m_ServerSimTime.stdDeviation); Overlay.Managed.Write(2, y++, "^FF0 lat : {0:0.0} / {1:0.0} / {2:0.0}", m_Latency.min, m_Latency.average, m_Latency.max); Overlay.Managed.Write(2, y++, "^0FF rtt : {0:0.0} / {1:0.0} / {2:0.0}", m_RTT.min, m_RTT.average, m_RTT.max); Overlay.Managed.Write(2, y++, "^0F0 cmdq : {0:0.0} / {1:0.0} / {2:0.0}", m_CMDQ.min, m_CMDQ.average, m_CMDQ.max); Overlay.Managed.Write(2, y++, "^F0F intp : {0:0.0} / {1:0.0} / {2:0.0}", m_Interp.min, m_Interp.average, m_Interp.max); y++; Overlay.Managed.Write(2, y++, "^22F header/payload/total bps (in):"); Overlay.Managed.Write(2, y++, "^22F {0:00.0} / {1:00.0} / {2:00.0} ({3})", m_HeaderBitsIn.graph.average / 8.0f * samplesPerSecond, (m_BytesIn.graph.average - m_HeaderBitsIn.graph.average / 8.0f) * samplesPerSecond, m_BytesIn.graph.average * samplesPerSecond, m_NetworkClient.clientConfig.serverUpdateRate); Overlay.Managed.Write(2, y++, "^F00 bps (out): {0:00.0}", m_BytesOut.graph.average * samplesPerSecond); Overlay.Managed.Write(2, y++, " pps (in): {0:00.0}", m_PackagesIn.graph.average * samplesPerSecond); Overlay.Managed.Write(2, y++, " pps (out): {0:00.0}", m_PackagesOut.graph.average * samplesPerSecond); Overlay.Managed.Write(2, y++, " pl% (in): {0:00.0}", m_PackageLossPctIn.average); Overlay.Managed.Write(2, y++, " pl% (out): {0:00.0}", m_PackageLossPctOut.average); y++; Overlay.Managed.Write(2, y++, " upd_srate: {0:00.0} ({1})", m_SnapshotsIn.graph.average * samplesPerSecond, m_NetworkClient.clientConfig.serverUpdateInterval); Overlay.Managed.Write(2, y++, " cmd_srate: {0:00.0} ({1})", m_CommandsOut.graph.average * samplesPerSecond, m_NetworkClient.serverTickRate); Overlay.Managed.Write(2, y++, " ev (in): {0:00.0}", m_EventsIn.graph.average * samplesPerSecond); Overlay.Managed.Write(2, y++, " ev (out): {0:00.0}", m_EventsOut.graph.average * samplesPerSecond); var startIndex = m_BytesIn.graph.GetData().HeadIndex; var graphY = 5; DebugOverlay.DrawGraph(38, graphY, 60, 5, m_Latency.GetData().GetArray(), startIndex, Color.yellow, 100); DebugOverlay.DrawGraph(38, graphY, 60, 5, m_RTT.GetData().GetArray(), startIndex, Color.cyan, 100); DebugOverlay.DrawGraph(38, graphY, 60, 5, m_CMDQ.GetData().GetArray(), startIndex, Color.green, 10); DebugOverlay.DrawGraph(38, graphY, 60, 5, m_Interp.GetData().GetArray(), startIndex, Color.magenta, 100); DebugOverlay.DrawHist(38, graphY, 60, 5, m_HardCatchup.GetArray(), startIndex, Color.red, 100); m_2GraphData[0] = m_BytesIn.graph.GetData().GetArray(); m_2GraphData[1] = m_BytesOut.graph.GetData().GetArray(); graphY += 7; DebugOverlay.DrawGraph(38, graphY, 60, 5, m_2GraphData, startIndex, m_BytesGraphColors); graphY += 6; DebugOverlay.DrawHist(38, graphY++, 60, 1, m_SnapshotsIn.graph.GetData().GetArray(), startIndex, Color.blue, 5.0f); DebugOverlay.DrawHist(38, graphY++, 60, 1, m_CommandsOut.graph.GetData().GetArray(), startIndex, Color.red, 5.0f); DebugOverlay.DrawHist(38, graphY++, 60, 1, m_EventsIn.graph.GetData().GetArray(), startIndex, Color.yellow, 5.0f); DebugOverlay.DrawHist(38, graphY++, 60, 1, m_EventsOut.graph.GetData().GetArray(), startIndex, Color.green, 5.0f); }
void DrawCompactStats() { var samplesPerSecond = 1.0f / m_StatsDeltaTime.average; Overlay.Managed.Write(-50, -4, "pps (in/out): {0} / {1}", m_PackagesIn.graph.average * samplesPerSecond, m_PackagesOut.graph.average * samplesPerSecond); Overlay.Managed.Write(-50, -3, "bps (in/out): {0:00.0} / {1:00.0}", m_BytesIn.graph.average * samplesPerSecond, m_BytesOut.graph.average * samplesPerSecond); var startIndex = m_BytesIn.graph.GetData().HeadIndex; DebugOverlay.DrawHist(-50, -2, 20, 2, m_BytesIn.graph.GetData().GetArray(), startIndex, Color.blue, 5.0f); }
void DrawFPS() { DebugOverlay.Write(0, 1, "{0} FPS ({1:##.##} ms)", Mathf.RoundToInt(1000.0f / m_FrameDurationMS), m_FrameDurationMS); float minDuration = float.MaxValue; float maxDuration = float.MinValue; float sum = 0; for (var i = 0; i < _no_frames; i++) { var frametime = m_FrameTimes[i]; sum += frametime; if (frametime < minDuration) { minDuration = frametime; } if (frametime > maxDuration) { maxDuration = frametime; } } DebugOverlay.Write(Color.green, 0, 2, "{0:##.##}", minDuration); DebugOverlay.Write(Color.grey, 6, 2, "{0:##.##}", sum / _no_frames); DebugOverlay.Write(Color.red, 12, 2, "{0:##.##}", maxDuration); DebugOverlay.Write(0, 3, "Frame #: {0}", Time.frameCount); DebugOverlay.Write(0, 4, m_GraphicsDeviceName); int y = 6; for (int i = 0; i < recordersList.Length; i++) { DebugOverlay.Write(0, y++, "{0:##.##}ms (*{1:##}) ({2:##.##}ms *{3:##}) {4}", recordersList[i].avgTime, recordersList[i].avgCount, recordersList[i].time, recordersList[i].count, recordersList[i].name); } if (showFPS.IntValue < 3) { return; } y++; // Start at framecount+1 so the one we have just recorded will be the last DebugOverlay.DrawHist(0, y, 20, 2, m_FrameTimes, Time.frameCount + 1, fpsColor, 20.0f); DebugOverlay.DrawHist(0, y + 2, 20, 2, m_TicksPerFrame, Time.frameCount + 1, histColor, 3.0f * 16.0f); DebugOverlay.DrawGraph(0, y + 6, 40, 2, m_FrameTimes, Time.frameCount + 1, fpsColor, 20.0f); if (GameWorld.s_Worlds.Count > 0) { var world = GameWorld.s_Worlds[0]; DebugOverlay.Write(0, y + 8, "Tick: {0:##.#}", 1000.0f * world.worldTime.tickInterval); } }
void DrawStats() { int y = 2; Overlay.Managed.Write(2, y++, " tick rate: {0}", Game.serverTickRate.IntValue); Overlay.Managed.Write(2, y++, " entities: {0}", m_NetworkServer.NumEntities); Overlay.Managed.Write(2, y++, " sim : {0:0.0} / {1:0.0} / {2:0.0} ({3:0.0})", m_ServerSimTime.min, m_ServerSimTime.min, m_ServerSimTime.max, m_ServerSimTime.stdDeviation); int totalSnapshots = 0; foreach (var c in m_NetworkServer.GetConnections()) { totalSnapshots += c.Value.counters.snapshotsOut; } snapsPerFrame[Time.frameCount % snapsPerFrame.Length] = (totalSnapshots - totalSnapshotsLastFrame); totalSnapshotsLastFrame = totalSnapshots; DebugOverlay.DrawHist(2, 10, 60, 5, snapsPerFrame, Time.frameCount % snapsPerFrame.Length, new Color(0.5f, 0.5f, 1.0f)); //for(var i = 0; i < counters.) //DebugOverlay.Write(2, y++, " entities: {0}", counters.numEntities); /* * * DebugOverlay.Write(2, y++, "^FF0 lat : {0:0.0} / {1:0.0} / {2:0.0}", m_Latency.min, m_Latency.average, m_Latency.max); * DebugOverlay.Write(2, y++, "^0FF rtt : {0:0.0} / {1:0.0} / {2:0.0}", m_RTT.min, m_RTT.average, m_RTT.max); * DebugOverlay.Write(2, y++, "^0F0 cmdq : {0:0.0} / {1:0.0} / {2:0.0}", m_CMDQ.min, m_CMDQ.average, m_CMDQ.max); * DebugOverlay.Write(2, y++, "^F0F intp : {0:0.0} / {1:0.0} / {2:0.0}", m_Interp.min, m_Interp.average, m_Interp.max); * * var samplesPerSecond = 1.0f / m_StatsDeltaTime.average; * * y++; * DebugOverlay.Write(2, y++, "^00F bps (in): {0:00.0} ({1})", m_BytesIn.graph.average * samplesPerSecond, m_NetworkClient.updateRate); * DebugOverlay.Write(2, y++, "^F00 bps (out): {0:00.0}", m_BytesOut.graph.average * samplesPerSecond); * DebugOverlay.Write(2, y++, " pps (in): {0:00.0}", m_PackagesIn.graph.average * samplesPerSecond); * DebugOverlay.Write(2, y++, " pps (out): {0:00.0}", m_PackagesOut.graph.average * samplesPerSecond); * DebugOverlay.Write(2, y++, " pl% (in): {0:00.0}", m_PackageLossPctIn.average); * DebugOverlay.Write(2, y++, " pl% (out): {0:00.0}", m_PackageLossPctOut.average); * * y++; * DebugOverlay.Write(2, y++, " upd_srate: {0:00.0} ({1})", m_SnapshotsIn.graph.average * samplesPerSecond, m_NetworkClient.updateSendRate); * DebugOverlay.Write(2, y++, " cmd_srate: {0:00.0} ({1})", m_CommandsOut.graph.average * samplesPerSecond, m_NetworkClient.commandSendRate); * DebugOverlay.Write(2, y++, " ev (in): {0:00.0}", m_EventsIn.graph.average * samplesPerSecond); * DebugOverlay.Write(2, y++, " ev (out): {0:00.0}", m_EventsOut.graph.average * samplesPerSecond); * * var startIndex = m_BytesIn.graph.GetData().HeadIndex; * var graphY = 5; * * DebugOverlay.DrawGraph(38, graphY, 60, 5, m_Latency.GetData().GetArray(), startIndex, Color.yellow, 100); * DebugOverlay.DrawGraph(38, graphY, 60, 5, m_RTT.GetData().GetArray(), startIndex, Color.cyan, 100); * DebugOverlay.DrawGraph(38, graphY, 60, 5, m_CMDQ.GetData().GetArray(), startIndex, Color.green, 10); * DebugOverlay.DrawGraph(38, graphY, 60, 5, m_Interp.GetData().GetArray(), startIndex, Color.magenta, 100); * DebugOverlay.DrawHist(38, graphY, 60, 5, m_HardCatchup.GetArray(), startIndex, Color.red, 100); * * m_2GraphData[0] = m_BytesIn.graph.GetData().GetArray(); * m_2GraphData[1] = m_BytesOut.graph.GetData().GetArray(); * * graphY += 7; * DebugOverlay.DrawGraph(38, graphY, 60, 5, m_2GraphData, startIndex, m_BytesGraphColors); * * graphY += 6; * DebugOverlay.DrawHist(38, graphY++, 60, 1, m_SnapshotsIn.graph.GetData().GetArray(), startIndex, Color.blue, 5.0f); * DebugOverlay.DrawHist(38, graphY++, 60, 1, m_CommandsOut.graph.GetData().GetArray(), startIndex, Color.red, 5.0f); * DebugOverlay.DrawHist(38, graphY++, 60, 1, m_EventsIn.graph.GetData().GetArray(), startIndex, Color.yellow, 5.0f); * DebugOverlay.DrawHist(38, graphY++, 60, 1, m_EventsOut.graph.GetData().GetArray(), startIndex, Color.green, 5.0f); */ }
public void TickUpdate() { if (m_ShowStats < 1) { return; } long ticks = m_StopWatch.ElapsedTicks; float frameDurationMs = (ticks - m_LastFrameTicks) * 1000 / (float)m_StopWatchFreq; m_LastFrameTicks = ticks; DebugOverlay.SetColor(Color.yellow); DebugOverlay.SetOrigin(0, 0); DebugOverlay.Write(1, 0, "FPS:{0,6:###.##}", 1.0f / Time.deltaTime); fpsHistory[Time.frameCount % fpsHistory.Length] = 1.0f / Time.deltaTime; DebugOverlay.DrawGraph(1, 1, 9, 1.5f, fpsHistory, Time.frameCount % fpsHistory.Length, Color.green); DebugOverlay.Write(30, 0, "Open console (F12) and type: \"showstats\" to toggle graphs"); if (m_ShowStats < 2) { return; } DebugOverlay.Write(0, 4, "Hello, {0,-5} world!", Time.frameCount % 100 < 50 ? "Happy" : "Evil"); DebugOverlay.Write(0, 5, "FrameNo: {0,7}", Time.frameCount); DebugOverlay.Write(0, 6, "MonoHeap:{0,7} kb", (int)(UnityEngine.Profiling.Profiler.GetMonoUsedSizeLong() / 1024)); /// Graphing difference between deltaTime and actual passed time float fps = Time.deltaTime * 1000.0f; var idx = Time.frameCount % fpsArray[0].Length;; fpsArray[0][idx] = -Mathf.Min(0, frameDurationMs - fps); fpsArray[1][idx] = Mathf.Max(0, frameDurationMs - fps); float variance, mean, min, max; CalcStatistics(fpsArray[0], out mean, out variance, out min, out max); // Draw histogram over time differences DebugOverlay.DrawHist(20, 10, 20, 3, fpsArray, Time.frameCount, colors, max); DebugOverlay.SetColor(new Color(1.0f, 0.3f, 0.0f)); DebugOverlay.Write(20, 14, "{0,4:#.###} ({1,4:##.#} +/- {2,4:#.##})", frameDurationMs - fps, mean, Mathf.Sqrt(variance)); DebugOverlay.DrawGraph(45, 10, 40, 3, fpsArray, Time.frameCount, colors, max); /// Graphing frametime var idx2 = Time.frameCount % frameTimeArray.Length; frameTimeArray[idx2] = frameDurationMs; CalcStatistics(frameTimeArray, out mean, out variance, out min, out max); DebugOverlay.DrawHist(20, 15, 20, 3, frameTimeArray, Time.frameCount, Color.red, max); // Draw legend float scale = 18.0f - 3.0f / max * 16.6667f; DebugOverlay.DrawLine(20, scale, 40, scale, Color.black); DebugOverlay.Write(20, 18, "{0,5} ({1} +/- {2})", frameDurationMs, mean, Mathf.Sqrt(variance)); DebugOverlay.DrawGraph(45, 15, 40, 3, frameTimeArray, Time.frameCount, Color.red, max); // Draw some lines to help visualize framerate fluctuations float ratio = (float)DebugOverlay.Height / DebugOverlay.Width * Screen.width / Screen.height; float time = (float)Time.frameCount / 60.0f; for (var i = 0; i < 10; i++) { DebugOverlay.DrawLine(60, 20, 60 + Mathf.Sin(Mathf.PI * 0.2f * i + time) * 8.0f, 20 + Mathf.Cos(Mathf.PI * 0.2f * i + time) * 8.0f * ratio, Color.black); } }