Ejemplo n.º 1
0
        public AggregationView()
        {
            InitializeComponent();

            // Design time!
            if (DesignerProperties.GetIsInDesignMode(this))
            {
                var appConfiguration   = new CapFrameXConfiguration();
                var recordDataProvider = new RecordDataProvider(new RecordDirectoryObserver(appConfiguration,
                                                                                            new LoggerFactory().CreateLogger <RecordDirectoryObserver>()), appConfiguration, new LoggerFactory().CreateLogger <RecordDataProvider>());
                DataContext = new AggregationViewModel(new FrametimeStatisticProvider(appConfiguration), recordDataProvider, new EventAggregator(), appConfiguration);
            }

            (DataContext as AggregationViewModel)
            .OutlierFlagStream
            .Throttle(TimeSpan.FromMilliseconds(100))
            .Subscribe(OnOutlierFlagsChanged);
        }
Ejemplo n.º 2
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);
            }
        }
Ejemplo n.º 3
0
        private List <string> GetAdjustedCaptureData()
        {
            if (!_captureData.Any())
            {
                return(Enumerable.Empty <string>().ToList());
            }

            var processName         = RecordDataProvider.GetProcessNameFromDataLine(_captureData.First());
            var startTimeWithOffset = RecordDataProvider.GetStartTimeFromDataLine(_captureData.First());
            var stopwatchTime       = (_timestampStopCapture - _timestampStartCapture) / 1000d;

            if (string.IsNullOrWhiteSpace(CaptureTimeString))
            {
                CaptureTimeString = "0";
                AddLoggerEntry($"Wrong capture time string. Value will be set to default (0).");
            }

            var  definedTime     = Convert.ToInt32(CaptureTimeString);
            bool autoTermination = Convert.ToInt32(CaptureTimeString) > 0;

            if (autoTermination)
            {
                if (stopwatchTime < definedTime - 0.2 && stopwatchTime > 0)
                {
                    autoTermination = false;
                }
            }

            var filteredArchive = _captureDataArchive.Where(line => RecordDataProvider.GetProcessNameFromDataLine(line) == processName).ToList();

            AddLoggerEntry($"Using archive with {filteredArchive.Count} frames.");

            if (!filteredArchive.Any())
            {
                AddLoggerEntry($"Empty archive. No file will be written.");
                return(Enumerable.Empty <string>().ToList());
            }

            // Distinct archive and live stream
            var lastArchiveTime = RecordDataProvider.GetStartTimeFromDataLine(filteredArchive.Last());
            int distinctIndex   = 0;

            for (int i = 0; i < _captureData.Count; i++)
            {
                if (RecordDataProvider.GetStartTimeFromDataLine(_captureData[i]) <= lastArchiveTime)
                {
                    distinctIndex++;
                }
                else
                {
                    break;
                }
            }

            if (distinctIndex == 0)
            {
                return(null);
            }

            var unionCaptureData          = filteredArchive.Concat(_captureData.Skip(distinctIndex)).ToList();
            var unionCaptureDataStartTime = RecordDataProvider.GetStartTimeFromDataLine(unionCaptureData.First());
            var unionCaptureDataEndTime   = RecordDataProvider.GetStartTimeFromDataLine(unionCaptureData.Last());

            AddLoggerEntry($"Length captured data + archive in sec: " +
                           $"{ Math.Round(unionCaptureDataEndTime - unionCaptureDataStartTime, 2)}");

            var captureInterval = new List <string>();

            double startTime = 0;

            // find first dataline that fits start of valid interval
            for (int i = 0; i < unionCaptureData.Count - 1; i++)
            {
                var currentQpcTime = RecordDataProvider.GetQpcTimeFromDataLine(unionCaptureData[i + 1]);

                if (currentQpcTime >= _qpcTimeStart)
                {
                    startTime = RecordDataProvider.GetStartTimeFromDataLine(unionCaptureData[i]);
                    break;
                }
            }

            if (startTime == 0)
            {
                AddLoggerEntry($"Start time is invalid. Error while evaluating QPCTime start.");
                return(Enumerable.Empty <string>().ToList());
            }

            if (!autoTermination)
            {
                for (int i = 0; i < unionCaptureData.Count; i++)
                {
                    var currentqpcTime = RecordDataProvider.GetQpcTimeFromDataLine(unionCaptureData[i]);
                    var currentTime    = RecordDataProvider.GetStartTimeFromDataLine(unionCaptureData[i]);

                    if (currentqpcTime >= _qpcTimeStart && currentTime - startTime <= stopwatchTime)
                    {
                        captureInterval.Add(unionCaptureData[i]);
                    }
                }

                if (!captureInterval.Any())
                {
                    AddLoggerEntry($"Empty capture interval. Error while evaluating start and end time.");
                    return(Enumerable.Empty <string>().ToList());
                }
            }
            else
            {
                AddLoggerEntry($"Length captured data QPCTime start to end with buffer in sec: " +
                               $"{ Math.Round(unionCaptureDataEndTime - startTime, 2)}");

                for (int i = 0; i < unionCaptureData.Count; i++)
                {
                    var currentStartTime = RecordDataProvider.GetStartTimeFromDataLine(unionCaptureData[i]);

                    if (currentStartTime >= startTime && currentStartTime - startTime <= definedTime)
                    {
                        captureInterval.Add(unionCaptureData[i]);
                    }
                }
            }

            return(captureInterval);
        }
Ejemplo n.º 4
0
        public void AddRunToHistory(List <string> captureData)
        {
            var frametimes = captureData.Select(line =>
                                                RecordDataProvider.GetFrameTimeFromDataLine(line)).ToList();

            if (RunHistoryCount == _numberOfRuns)
            {
                if (!_runHistoryOutlierFlags.All(x => x == false) &&
                    _appConfiguration.OutlierHandling == EOutlierHandling.Replace.ConvertToString())
                {
                    var historyDefault = Enumerable.Repeat("N/A", _numberOfRuns).ToList();
                    var validRuns      = _runHistory.Where((run, i) => _runHistoryOutlierFlags[i] == false).ToList();

                    for (int i = 0; i < validRuns.Count; i++)
                    {
                        historyDefault[i] = validRuns[i];
                    }

                    var validCaptureData    = _captureDataHistory.Where((run, i) => _runHistoryOutlierFlags[i] == false);
                    var validFrametimes     = _frametimeHistory.Where((run, i) => _runHistoryOutlierFlags[i] == false);
                    var validMetricAnalysis = _metricAnalysis.Where((run, i) => _runHistoryOutlierFlags[i] == false);

                    _runHistory         = historyDefault.ToList();
                    _captureDataHistory = validCaptureData.ToList();
                    _frametimeHistory   = validFrametimes.ToList();
                    _metricAnalysis     = validMetricAnalysis.ToList();

                    // local reset
                    _runHistoryOutlierFlags = Enumerable.Repeat(false, _numberOfRuns).ToArray();
                    SetRunHistory(_runHistory.ToArray());
                    SetRunHistoryAggregation(string.Empty);
                    SetRunHistoryOutlierFlags(_runHistoryOutlierFlags);
                }
                else
                {
                    ResetHistory();
                }
            }

            if (RunHistoryCount < _numberOfRuns)
            {
                // metric history
                var currentAnalysis = _statisticProvider.GetMetricAnalysis(frametimes, SecondMetric, ThirdMetric);
                _metricAnalysis.Add(currentAnalysis);
                _runHistory[RunHistoryCount] = currentAnalysis.ResultString;
                SetRunHistory(_runHistory.ToArray());

                // capture data history
                _captureDataHistory.Add(captureData);

                // frametime history
                _frametimeHistory.Add(frametimes);

                if (_appConfiguration.UseAggregation &&
                    RunHistoryCount == _numberOfRuns)
                {
                    _runHistoryOutlierFlags = _statisticProvider
                                              .GetOutlierAnalysis(_metricAnalysis,
                                                                  _appConfiguration.RelatedMetricOverlay,
                                                                  _appConfiguration.OutlierPercentageOverlay);
                    SetRunHistoryOutlierFlags(_runHistoryOutlierFlags);

                    if ((_runHistoryOutlierFlags.All(x => x == false) &&
                         _appConfiguration.OutlierHandling == EOutlierHandling.Replace.ConvertToString()) ||
                        _appConfiguration.OutlierHandling == EOutlierHandling.Ignore.ConvertToString())
                    {
                        SetRunHistoryAggregation(GetAggregation());

                        // write aggregated file
                        Task.Run(async() =>
                        {
                            await SetTaskDelayOffset().ContinueWith(_ =>
                            {
                                _recordDataProvider
                                .SaveAggregatedPresentData(_captureDataHistory);
                            }, CancellationToken.None, TaskContinuationOptions.RunContinuationsAsynchronously, TaskScheduler.Default);
                        });
                    }
                }
            }
        }