private void AnimationSelectorChanged(object sender, EventArgs e) { mFrameSelector.Items.Clear(); for (int frame = -1; frame <= ((Animation)mAnimationSelector.SelectedItem).NumFrames() - 1; frame++) { FrameSelection frameSelection = new FrameSelection(); frameSelection.Frame = frame; mFrameSelector.Items.Add(frameSelection); } mScriptEditor.HideEditables(); }
public static void WriteToFile(string filename, ProfilingFormat format, FrameSelection frameSelection = FrameSelection.Median) { if (!ProfilingEnabled) { throw new InvalidOperationException("Cannot write profile to file when profiling is not enabled."); } ProfilerFrame frame = default; if (collectedFrames.IsEmpty) { return; } bool needsDispose = false; switch (frameSelection) { case FrameSelection.Median: var ordered = collectedFrames.OrderBy(x => x.frameLength).ToArray(); frame = ordered[(int)Math.Floor(ordered.Length / 2.0)]; break; case FrameSelection.Longest: frame = collectedFrames.MaxBy(x => x.frameLength); break; case FrameSelection.Shortest: frame = collectedFrames.MinBy(x => x.frameLength); break; case FrameSelection.Latest: frame = collectedFrames.Back(); break; case FrameSelection.Percentile95: ordered = collectedFrames.OrderBy(x => x.frameLength).ToArray(); int index = ordered.Length - (int)(ordered.Length * 0.05f); if (index >= ordered.Length) { index = ordered.Length - 1; } frame = ordered[index]; break; case FrameSelection.All: frame = new ProfilerFrame(); frame.frameNumber = collectedFrames.Min(x => x.frameNumber); frame.frameLength = collectedFrames.Sum(x => x.frameLength); frame.markers = PooledList <ProfilerMarker> .Create(); double elapsedTime = 0; foreach (var collectedFrame in collectedFrames) { if (collectedFrame.markers != null) { frame.markers.AddRange(collectedFrame.markers.Select(x => new ProfilerMarker(x.markName, x.time + elapsedTime))); } elapsedTime += collectedFrame.frameLength; } frame.threadMethods = PooledList <(string, PooledList <ProfilerMethod>)> .Create(); elapsedTime = 0; foreach (var collectedFrame in collectedFrames) { foreach (var collectedFrameThreadMethod in collectedFrame.threadMethods) { var tuple = frame.threadMethods.SingleOrDefault(x => x.Item1 == collectedFrameThreadMethod.Item1); PooledList <ProfilerMethod> outList = null; if (tuple.Item1 == null) { outList = PooledList <ProfilerMethod> .Create(); frame.threadMethods.Add((collectedFrameThreadMethod.Item1, outList)); } else { outList = tuple.Item2; } outList.AddRange(collectedFrameThreadMethod.Item2.Select(x => new ProfilerMethod( x.methodName, x.depth, x.startTime + elapsedTime, x.endTime + elapsedTime, x.threadId))); } elapsedTime += collectedFrame.frameLength; } needsDispose = true; break; default: throw new ArgumentOutOfRangeException(nameof(frameSelection), frameSelection, null); } switch (format) { case ProfilingFormat.SpeedScope: SpeedScopeWriter.WriteToFile(frame, filename); break; case ProfilingFormat.ChromeTracing: ChromeTracingWriter.WriteToFile(frame, filename); break; default: throw new ArgumentOutOfRangeException(nameof(format), format, null); } if (needsDispose) { frame.Dispose(); } }