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())
            });
        }
Beispiel #2
0
        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);
                    }
                }
            }
        }
Beispiel #3
0
        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);
            }
        }