Esempio n. 1
0
        private void InitialiseLoopProperties()
        {
            _timer = _timerFactory.Create();
            _timer.Reset();

            //For FIXED_ADAPTIVE update time steps, we do not start at the smallest possible timestep. Here is hardcorded 120FPS
            var timeStep = _startUpPropertiesCache.User.UpdatePeriodType == UpdatePeriod.Fixed_Adaptive &&
                           _startUpPropertiesCache.User.FixedOrSmallestUpdateTimeStepInSeconds < 1.0f / 120.0f ?
                           1.0f / 120.0f : _startUpPropertiesCache.User.FixedOrSmallestUpdateTimeStepInSeconds;

            _loopProperties = new LoopProperties
            {
                UpdatePeriodType = _startUpPropertiesCache.User.UpdatePeriodType,
                ProcessFractionalUpdatesBeforeDraw        = _startUpPropertiesCache.User.ProcessFractionalUpdatesBeforeDraw,
                SmallestFixedUpdateTimeStepInSeconds      = _startUpPropertiesCache.User.FixedOrSmallestUpdateTimeStepInSeconds,
                FixedUpdateTimeStepInSeconds              = timeStep,
                DoNotDrawFrameUnlessThereHasBeenOneUpdate = _startUpPropertiesCache.User.RequireAtleastOneUpdatePerDraw,
                Running          = false,
                TimeOfLastUpdate = 0.0,
                TimeOfLastDraw   = 0.0,
                HasThereBeenAnUpdateSinceTheLastDraw = false
            };

            _updater = _updatePeriodFactory.Create(_loopProperties.UpdatePeriodType);
        }
Esempio n. 2
0
        public void AnalysePeriod(ITimer _loopTimer, LoopProperties _loopProps)
        {
            if (_valuesSinceLastAnalysis >= NUMBER_OF_UPDATES_TO_SMOOTH_FRAMETIME)
            {
                var average = 0.0;
                for (var n = 0; n < NUMBER_OF_UPDATES_TO_SMOOTH_FRAMETIME; n++)
                {
                    average += _times[n];
                }

                average *= 1.0 / (1.0 * NUMBER_OF_UPDATES_TO_SMOOTH_FRAMETIME);

                var variance = 0.0;
                for (var n = 0; n < NUMBER_OF_UPDATES_TO_SMOOTH_FRAMETIME; n++)
                {
                    var delta = _times[n] - average;
                    variance += delta * delta;
                }

                variance /= 1.0 * NUMBER_OF_UPDATES_TO_SMOOTH_FRAMETIME;

                _valuesSinceLastAnalysis = 0;

                _debugAnalytics.Updater_AverageFrameTime  = average;
                _debugAnalytics.Updater_FrameTimeVariance = variance;
            }

            _debugAnalytics.Updater_TimestepType               = UpdatePeriod.Variable;
            _debugAnalytics.Updater_OverutilisedFlag           = false;
            _debugAnalytics.Updater_UnderutilisedFlag          = false;
            _debugAnalytics.Updater_UpdateProcessingPercentage = 1.0f;
        }
Esempio n. 3
0
        public void AnalysePeriod(ITimer loopTimer, LoopProperties loopProps)
        {
            var timeDelta = loopTimer.Seconds - _analysisPeriodTimeStart;

            var percentageProcessingUpdates = _updatingTimeCount / timeDelta;

            if (percentageProcessingUpdates > OVER_UTILISATION_THRESHOLD)
            {
                _overutilisedFrameCount++;
            }
            else
            {
                _overutilisedFrameCount--;
                if (_overutilisedFrameCount < 0)
                {
                    _overutilisedFrameCount = 0;
                }
            }

            _debugAnalytics.Updater_TimestepType               = UpdatePeriod.Fixed;
            _debugAnalytics.Updater_OverutilisedFlag           = percentageProcessingUpdates > OVERUTILISED_FRAME_SUM_OVERFLOW_FOR_FLAGGING;
            _debugAnalytics.Updater_UpdateProcessingPercentage = percentageProcessingUpdates;
            _debugAnalytics.Updater_AverageFrameTime           = loopProps.FixedUpdateTimeStepInSeconds;
            _debugAnalytics.Updater_FrameTimeVariance          = 0.0f;
        }
Esempio n. 4
0
        public void ProcessSingleUpdate(double updatePeriod, LoopProperties loopProps, IFramesPerSecondMonitor framesPerSecondMonitor, Func <float, bool> update, ITimer loopTimer)
        {
            loopProps.Running           = update((float)updatePeriod);
            loopProps.TimeOfLastUpdate += updatePeriod;
            framesPerSecondMonitor.RegisterUpdateFrame();

            AddPeriodToBuffer(updatePeriod);
        }
        private void DecreaseFixedTimeStep(LoopProperties loopProps)
        {
            var halfed = 0.5 * loopProps.FixedUpdateTimeStepInSeconds;

            if (halfed >= loopProps.SmallestFixedUpdateTimeStepInSeconds)
            {
                loopProps.FixedUpdateTimeStepInSeconds = halfed;
            }
        }
Esempio n. 6
0
        public void ProcessRequiredUpdates(double timeSinceLastUpdate, LoopProperties loopProps, IFramesPerSecondMonitor framesPerSecondMonitor, Func <float, bool> update, ITimer loopTimer)
        {
            if (timeSinceLastUpdate < loopProps.SmallestFixedUpdateTimeStepInSeconds)
            {
                return;
            }

            ProcessSingleUpdate(timeSinceLastUpdate, loopProps, framesPerSecondMonitor, update, loopTimer);
            loopProps.HasThereBeenAnUpdateSinceTheLastDraw = true;
        }
        public void ProcessRequiredUpdates(double timeSinceLastUpdate, LoopProperties loopProps, IFramesPerSecondMonitor framesPerSecondMonitor, Func <float, bool> update, ITimer loopTimer)
        {
            var period = timeSinceLastUpdate;

            while (period > loopProps.FixedUpdateTimeStepInSeconds && loopProps.Running)
            {
                ProcessSingleUpdate(loopProps.FixedUpdateTimeStepInSeconds, loopProps, framesPerSecondMonitor, update, loopTimer);
                period -= loopProps.FixedUpdateTimeStepInSeconds;
                loopProps.HasThereBeenAnUpdateSinceTheLastDraw = true;
            }
        }
        public void ProcessSingleUpdate(double updatePeriod, LoopProperties loopProps, IFramesPerSecondMonitor framesPerSecondMonitor, Func <float, bool> update, ITimer loopTimer)
        {
            var startTime = loopTimer.Seconds;

            loopProps.Running = update((float)updatePeriod);
            var timeDelta = loopTimer.Seconds - startTime;

            _updatingTimeCount += timeDelta;

            loopProps.TimeOfLastUpdate += updatePeriod;
            framesPerSecondMonitor.RegisterUpdateFrame();
        }
Esempio n. 9
0
        public void ProcessMessageQueue(LoopProperties loopProperties)
        {
            while (_messageQueue.Count > 0)
            {
                var msg = _messageQueue.Dequeue();

                switch (msg)
                {
                case CoreMessage.Shutdown:
                    loopProperties.Running = false;
                    break;

                case CoreMessage.DeviceOrRenderTargetsReset:
                    _systemComponents.RecreateDeviceAndReinitialiseAllResources(_systemResourcesReinitialiser.ReInitialise);
                    break;
                }
            }
        }
Esempio n. 10
0
        public void AnalysePeriod(ITimer loopTimer, LoopProperties loopProps)
        {
            var timeDelta = loopTimer.Seconds - _analysisPeriodTimeStart;

            var percentageProcessingUpdates = _updatingTimeCount / timeDelta;

            if (percentageProcessingUpdates > OVER_UTILISATION_THRESHOLD)
            {
                _overutilisedFrameCount++;

                if (_overutilisedFrameCount > CONSECUTIVE_SLOW_FRAMES_REQUIRED_FOR_DOUBLING)
                {
                    IncreaseFixedTimeStep(loopProps);
                    _overutilisedFrameCount = 0;
                }
            }
            else
            {
                _overutilisedFrameCount = 0;
            }

            if (percentageProcessingUpdates < UNDER_UTILISATION_THRESHOLD)
            {
                _underutilisedFrameCount++;
                if (_underutilisedFrameCount > CONSECUTIVE_FAST_FRAMES_REQUIRED_FOR_HALFING)
                {
                    DecreaseFixedTimeStep(loopProps);
                    _underutilisedFrameCount = 0;
                }
            }
            else
            {
                _underutilisedFrameCount = 0;
            }

            _debugAnalytics.Updater_TimestepType               = UpdatePeriod.Fixed_Adaptive;
            _debugAnalytics.Updater_OverutilisedFlag           = percentageProcessingUpdates > OVER_UTILISATION_THRESHOLD;
            _debugAnalytics.Updater_UnderutilisedFlag          = percentageProcessingUpdates > UNDER_UTILISATION_THRESHOLD;
            _debugAnalytics.Updater_UpdateProcessingPercentage = percentageProcessingUpdates;
            _debugAnalytics.Updater_AverageFrameTime           = loopProps.FixedUpdateTimeStepInSeconds;
            _debugAnalytics.Updater_FrameTimeVariance          = 0.0f;
        }
Esempio n. 11
0
 private void IncreaseFixedTimeStep(LoopProperties loopProps)
 {
     loopProps.FixedUpdateTimeStepInSeconds *= 2.0;
 }