public async Task <SessionDetailDTO> Handle(GetSessionDetailByFileIdQuery request, CancellationToken cancellationToken) { var(fileName, fileBytes) = await _sessionService.DownloadAsset(request.FileId); if (fileName.EndsWith(".gz")) { fileBytes = fileBytes.Decompress(); } var session = JsonConvert.DeserializeObject <Session>(Encoding.UTF8.GetString(fileBytes)); var infos = session.Info.GetType().GetProperties().Where(p => p.GetCustomAttributes(false).Any(a => a is DescriptionAttribute)).ToDictionary(p => (p.GetCustomAttributes(false).First(a => a is DescriptionAttribute) as DescriptionAttribute)?.Description, p => Convert.ToString(p.GetValue(session.Info))); var sensorItems = SensorReport.GetReportFromSessionSensorData(session.Runs.Select(r => r.SensorData)).ToArray(); var frametimeStatisticsProviderOptions = new FrametimeStatisticProviderOptions() { MovingAverageWindowSize = 1000, FpsValuesRoundingDigits = 2 }; var plotSettings = new PlotSettings(); var frametimeStatisticProvider = new FrametimeStatisticProvider(frametimeStatisticsProviderOptions); var fpsGraphBuilder = new FpsGraphPlotBuilder(frametimeStatisticsProviderOptions, frametimeStatisticProvider); fpsGraphBuilder.BuildPlotmodel(session, plotSettings, 0, 1000, ERemoveOutlierMethod.None); var frametimeGraphBuilder = new FrametimePlotBuilder(frametimeStatisticsProviderOptions, frametimeStatisticProvider); frametimeGraphBuilder.BuildPlotmodel(session, plotSettings, 0, 1000, ERemoveOutlierMethod.None); var exporter = new SvgExporter { Width = 1000, Height = 400 }; using var frametimeGraphStream = new MemoryStream(); exporter.Export(frametimeGraphBuilder.PlotModel, frametimeGraphStream); using var fpsGraphStream = new MemoryStream(); exporter.Export(fpsGraphBuilder.PlotModel, fpsGraphStream); var frametimes = session.GetFrametimeTimeWindow(0, 1000, frametimeStatisticsProviderOptions, ERemoveOutlierMethod.None); var fpsTresholdsLabels = FrametimeStatisticProvider.FPSTHRESHOLDS.ToArray(); var fpsTresholdsCounts = frametimeStatisticProvider.GetFpsThresholdCounts(frametimes, false).Select(val => (double)val / frametimes.Count()).ToArray(); var fpsTresholdsCountsDictionary = Enumerable.Range(0, fpsTresholdsLabels.Count()).ToDictionary(idx => (int)fpsTresholdsLabels[idx], idx => fpsTresholdsCounts[idx]).Where(kvp => !double.IsNaN(kvp.Value)); var fpsTresholdsTimes = frametimeStatisticProvider.GetFpsThresholdTimes(frametimes, false).Select(val => val / frametimes.Sum()).ToArray(); var fpsTresholdsTimesDictionary = Enumerable.Range(0, fpsTresholdsLabels.Count()).ToDictionary(idx => (int)fpsTresholdsLabels[idx], idx => fpsTresholdsTimes[idx]).Where(kvp => !double.IsNaN(kvp.Value)); var fpsMetricDictionary = Enum.GetValues(typeof(EMetric)).Cast <EMetric>().ToDictionary(metric => metric.GetAttribute <DescriptionAttribute>().Description, metric => frametimeStatisticProvider.GetFpsMetricValue(frametimes, metric)).Where(kvp => !double.IsNaN(kvp.Value)); return(new SessionDetailDTO() { Infos = infos, SensorItems = sensorItems, FpsTresholdsCounts = fpsTresholdsCountsDictionary, FpsTresholdsTimes = fpsTresholdsTimesDictionary, FpsMetric = fpsMetricDictionary, FpsGraph = Encoding.UTF8.GetString(fpsGraphStream.ToArray()), FrametimeGraph = Encoding.UTF8.GetString(frametimeGraphStream.ToArray()) }); }
private async Task UpdateMissingModelData(List <SqSessionCollection> sessionCollectionItems) { var client2 = _squidexClientManager.CreateContentsClient <SqSessionCollection, SqSessionCollectionData>("sessioncollections"); using ((IDisposable)client2) { foreach (var collection in sessionCollectionItems) { if (collection.Data.Sessions.Any(s => string.IsNullOrWhiteSpace(s.Cpu))) { foreach (var session in collection.Data.Sessions) { if (session.File.FirstOrDefault() != null) { string fileName; byte[] fileBytes; (fileName, fileBytes) = await DownloadAsset(new Guid(session.File.First())); if (fileName.EndsWith(".gz")) { fileBytes = fileBytes.Decompress(); } var sessionFromJson = JsonConvert.DeserializeObject <Session>(Encoding.UTF8.GetString(fileBytes)); session.GameName = sessionFromJson.Info.GameName; session.Cpu = sessionFromJson.Info.Processor; session.Gpu = sessionFromJson.Info.GPU; session.Ram = sessionFromJson.Info.SystemRam; session.Mainboard = sessionFromJson.Info.Motherboard; IFrametimeStatisticProviderOptions _frametimeStatisticProviderOptions = new FrametimeStatisticProviderOptions() { MovingAverageWindowSize = 500, IntervalAverageWindowTime = 500, FpsValuesRoundingDigits = 2 }; FrametimeStatisticProvider _frametimeStatisticProvider = new FrametimeStatisticProvider(_frametimeStatisticProviderOptions); var frametimes = sessionFromJson.GetFrametimeTimeWindow(0, 1000, _frametimeStatisticProviderOptions); session.AverageFps = _frametimeStatisticProvider.GetFpsMetricValue(frametimes, EMetric.Average); session.P1Fps = _frametimeStatisticProvider.GetFpsMetricValue(frametimes, EMetric.P1); } } await client2.UpdateAsync(collection.Id, collection.Data); } } } }
public StateView() { InitializeComponent(); if (DesignerProperties.GetIsInDesignMode(this)) { var appConfiguration = new CapFrameXConfiguration(); var statisticProvider = new FrametimeStatisticProvider(appConfiguration); var recordDirectoryObserver = new RecordDirectoryObserver(appConfiguration, new LoggerFactory().CreateLogger <RecordDirectoryObserver>()); var recordDataProvider = new RecordDataProvider(recordDirectoryObserver, appConfiguration, new LoggerFactory().CreateLogger <RecordDataProvider>()); var overlayEntryProvider = new OverlayEntryProvider(); var appVersionProvider = new AppVersionProvider(); var webVersionProvider = new WebVersionProvider(); DataContext = new StateViewModel(new RecordDirectoryObserver(appConfiguration, new LoggerFactory().CreateLogger <RecordDirectoryObserver>()), new EventAggregator(), appConfiguration, new PresentMonCaptureService(), new OverlayService(statisticProvider, recordDataProvider, overlayEntryProvider, appConfiguration, new LoggerFactory().CreateLogger <OverlayService>()), new UpdateCheck(appVersionProvider, webVersionProvider), appVersionProvider, webVersionProvider); } }