private void AddToFrameTimeChart(ComparisonRecordInfoWrapper wrappedComparisonInfo) { double startTime = FirstSeconds; double endTime = LastSeconds; var session = wrappedComparisonInfo.WrappedRecordInfo.Session; var frametimePoints = session.GetFrametimePointsTimeWindow(startTime, endTime, _appConfiguration) .Select(pnt => new Point(pnt.X, pnt.Y)); var chartTitle = string.Empty; var color = wrappedComparisonInfo.FrametimeGraphColor.Value; var frametimeSeries = new Statistics.PlotBuilder.LineSeries() { Tag = wrappedComparisonInfo.WrappedRecordInfo.FileRecordInfo.Id, Title = chartTitle, StrokeThickness = 1, LegendStrokeThickness = 4, Color = wrappedComparisonInfo.IsHideModeSelected ? OxyColors.Transparent : OxyColor.FromRgb(color.R, color.G, color.B) }; frametimeSeries.Points.AddRange(frametimePoints.Select(pnt => new DataPoint(pnt.X, pnt.Y))); ComparisonModel.Series.Add(frametimeSeries); }
private void SetFrameInputLagChart(IList <double> frametimes, IList <double> upperBoundInputlagtimes, IList <double> lowerBoundInputlagtimes) { if (frametimes.IsNullOrEmpty() || upperBoundInputlagtimes.IsNullOrEmpty() || lowerBoundInputlagtimes.IsNullOrEmpty()) { InputLagModel = new PlotModel { PlotMargins = new OxyThickness(40, 10, 0, 40), PlotAreaBorderColor = _appConfiguration.UseDarkMode ? OxyColor.FromArgb(100, 204, 204, 204) : OxyColor.FromArgb(50, 30, 30, 30), LegendPosition = LegendPosition.TopCenter, LegendOrientation = LegendOrientation.Horizontal, }; return; } var appMissed = _session.Runs.SelectMany(r => r.CaptureData.Dropped).ToList(); var filteredFrametimes = frametimes.Where((ft, i) => appMissed[i] != true).ToList(); var yMin = Math.Min(filteredFrametimes.Min(), lowerBoundInputlagtimes.Min()); var yMax = Math.Max(filteredFrametimes.Max(), upperBoundInputlagtimes.Max()); var frametimeSeries = new Statistics.PlotBuilder.LineSeries { Title = "Frametimes", StrokeThickness = 1, LegendStrokeThickness = 4, Color = Constants.FrametimeStroke }; var upperBoundInputLagSeries = new Statistics.PlotBuilder.LineSeries { Title = "Input lag high", StrokeThickness = 1, LegendStrokeThickness = 4, Color = OxyColor.FromRgb(255, 150, 150) }; var lowerBoundInputLagSeries = new Statistics.PlotBuilder.LineSeries { Title = "Input lag low", StrokeThickness = 1, LegendStrokeThickness = 4, Color = OxyColor.FromRgb(200, 140, 140) }; var areaSeries = new AreaSeries() { StrokeThickness = 1, Color = OxyColors.Transparent, Fill = OxyColor.FromArgb(64, 225, 145, 145) }; frametimeSeries.Points.AddRange(filteredFrametimes.Select((x, i) => new DataPoint(i, x))); upperBoundInputLagSeries.Points.AddRange(upperBoundInputlagtimes.Select((x, i) => new DataPoint(i, x))); lowerBoundInputLagSeries.Points.AddRange(lowerBoundInputlagtimes.Select((x, i) => new DataPoint(i, x))); areaSeries.Points.AddRange(lowerBoundInputlagtimes.Select((x, i) => new DataPoint(i, x))); areaSeries.Points2.AddRange(upperBoundInputlagtimes.Select((x, i) => new DataPoint(i, x))); Application.Current.Dispatcher.Invoke(new Action(() => { var tmp = new PlotModel { PlotMargins = new OxyThickness(40, 10, 40, 40), PlotAreaBorderColor = OxyColor.FromArgb(64, 204, 204, 204), LegendPosition = LegendPosition.TopCenter, LegendOrientation = LegendOrientation.Horizontal, TextColor = _appConfiguration.UseDarkMode ? OxyColors.White : OxyColors.Black }; tmp.Series.Add(frametimeSeries); tmp.Series.Add(upperBoundInputLagSeries); tmp.Series.Add(lowerBoundInputLagSeries); tmp.Series.Add(areaSeries); //Axes //X tmp.Axes.Add(new LinearAxis() { Key = "xAxis", Position = OxyPlot.Axes.AxisPosition.Bottom, Title = "Samples", Minimum = 0, Maximum = filteredFrametimes.Count(), MajorGridlineStyle = LineStyle.Solid, MajorGridlineThickness = 1, MajorGridlineColor = _appConfiguration.UseDarkMode ? OxyColor.FromArgb(40, 204, 204, 204) : OxyColor.FromArgb(20, 30, 30, 30), MinorTickSize = 0, MajorTickSize = 0 }); //Y tmp.Axes.Add(new LinearAxis() { Key = "yAxis", Position = OxyPlot.Axes.AxisPosition.Left, Title = "Frametime + input lag [ms]", Minimum = yMin - (yMax - yMin) / 6, Maximum = yMax + (yMax - yMin) / 6, MajorGridlineStyle = LineStyle.Solid, MajorGridlineThickness = 1, MajorGridlineColor = _appConfiguration.UseDarkMode ? OxyColor.FromArgb(40, 204, 204, 204) : OxyColor.FromArgb(20, 30, 30, 30), MinorTickSize = 0, MajorTickSize = 0 }); InputLagModel = tmp; })); }
private void SetFrameDisplayTimesChart(IList <double> frametimes, IList <double> displaytimes) { if (frametimes == null || !frametimes.Any()) { return; } if (displaytimes == null || !displaytimes.Any()) { return; } var yMin = Math.Min(frametimes.Min(), displaytimes.Min()); var yMax = Math.Max(frametimes.Max(), displaytimes.Max()); var frametimeSeries = new Statistics.PlotBuilder.LineSeries { Title = "Frametimes", StrokeThickness = 1, LegendStrokeThickness = 4, Color = Constants.FrametimeStroke }; var untilDisplayedTimesSeries = new Statistics.PlotBuilder.LineSeries { Title = "Until displayed times", StrokeThickness = 1, LegendStrokeThickness = 4, Color = OxyColor.FromArgb(150, 241, 125, 32) }; frametimeSeries.Points.AddRange(frametimes.Select((x, i) => new DataPoint(i, x))); untilDisplayedTimesSeries.Points.AddRange(displaytimes.Select((x, i) => new DataPoint(i, x))); Application.Current.Dispatcher.Invoke(new Action(() => { var tmp = new PlotModel { PlotMargins = new OxyThickness(40, 10, 40, 40), PlotAreaBorderColor = _appConfiguration.UseDarkMode ? OxyColor.FromArgb(100, 204, 204, 204) : OxyColor.FromArgb(50, 30, 30, 30), LegendPosition = LegendPosition.TopCenter, LegendOrientation = LegendOrientation.Horizontal, TextColor = _appConfiguration.UseDarkMode ? OxyColors.White : OxyColors.Black }; tmp.Series.Add(frametimeSeries); tmp.Series.Add(untilDisplayedTimesSeries); //Axes //X tmp.Axes.Add(new LinearAxis() { Key = "xAxis", Position = OxyPlot.Axes.AxisPosition.Bottom, Title = "Samples", Minimum = 0, Maximum = frametimes.Count, MajorGridlineStyle = LineStyle.Solid, MajorGridlineThickness = 1, MajorGridlineColor = _appConfiguration.UseDarkMode ? OxyColor.FromArgb(40, 204, 204, 204) : OxyColor.FromArgb(20, 30, 30, 30), MinorTickSize = 0, MajorTickSize = 0 }); //Y tmp.Axes.Add(new LinearAxis() { Key = "yAxis", Position = OxyPlot.Axes.AxisPosition.Left, Title = "Frametime + until displayed time [ms]", Minimum = yMin - (yMax - yMin) / 6, Maximum = yMax + (yMax - yMin) / 6, MajorGridlineStyle = LineStyle.Solid, MajorGridlineThickness = 1, MajorGridlineColor = _appConfiguration.UseDarkMode ? OxyColor.FromArgb(40, 204, 204, 204) : OxyColor.FromArgb(20, 30, 30, 30), MinorTickSize = 0, MajorTickSize = 0 }); SynchronizationModel = tmp; })); }