public void Update_ShouldExecuteEngineSystemsInCorrectOrder() { // Arrange GameTime.FixedDeltaTime = TimeSpan.FromSeconds(0.1); var gameTime = new GameTime(TimeSpan.FromSeconds(0.15)); _gameTimeProvider.GetGameTime().Returns(gameTime); var scene = TestSceneFactory.Create(); _sceneManager.CurrentScene.Returns(scene); var gameLoop = GetGameLoop(); // Act gameLoop.Update(); // Assert Received.InOrder(() => { _inputSystem.Received(1).ProcessInput(scene); _behaviorSystem.Received(1).ProcessBehaviorFixedUpdate(scene); _customSystem1.Received(1).ProcessFixedUpdate(scene); _customSystem2.Received(1).ProcessFixedUpdate(scene); _customSystem3.Received(1).ProcessFixedUpdate(scene); _physicsSystem.Received(1).ProcessPhysics(scene); _entityDestructionSystem.Received(1).DestroyEntitiesAfterFixedTimeStep(scene); _behaviorSystem.Received(1).ProcessBehaviorUpdate(scene, gameTime); _customSystem1.Received(1).ProcessUpdate(scene, gameTime); _customSystem2.Received(1).ProcessUpdate(scene, gameTime); _customSystem3.Received(1).ProcessUpdate(scene, gameTime); _physicsSystem.Received(1).PreparePhysicsDebugInformation(); _audioSystem.Received(1).ProcessAudio(scene); _animationSystem.Received(1).ProcessAnimations(scene, gameTime); _renderingSystem.Received(1).RenderScene(scene); _entityDestructionSystem.Received(1).DestroyEntitiesAfterFullFrame(scene); }); }
public void Update() { _sceneManager.OnNextFrame(); var scene = _sceneManager.CurrentScene; Debug.Assert(scene != null, nameof(scene) + "scene != null"); var gameTime = _gameTimeProvider.GetGameTime(); _timeToSimulate += gameTime.DeltaTime; var fixedUpdatesPerFrame = 0; while (_timeToSimulate >= GameTime.FixedDeltaTime && (fixedUpdatesPerFrame < _fixedUpdatesPerFrameLimit || _fixedUpdatesPerFrameLimit == 0)) { using (_performanceStatisticsRecorder.RecordSystemExecution(_engineSystems.InputSystemName)) { _engineSystems.InputSystem.ProcessInput(scene); } using (_performanceStatisticsRecorder.RecordSystemExecution(_engineSystems.BehaviorSystemName)) { _engineSystems.BehaviorSystem.ProcessBehaviorFixedUpdate(scene); } foreach (var customSystem in _engineSystems.CustomSystems) { using (_performanceStatisticsRecorder.RecordSystemExecution(customSystem.Name)) { customSystem.ProcessFixedUpdate(scene); } } using (_performanceStatisticsRecorder.RecordSystemExecution(_engineSystems.PhysicsSystemName)) { _engineSystems.PhysicsSystem.ProcessPhysics(scene); } using (_performanceStatisticsRecorder.RecordSystemExecution(_engineSystems.EntityDestructionSystemName)) { _engineSystems.EntityDestructionSystem.DestroyEntitiesAfterFixedTimeStep(scene); } _timeToSimulate -= GameTime.FixedDeltaTime; fixedUpdatesPerFrame++; } using (_performanceStatisticsRecorder.RecordSystemExecution(_engineSystems.BehaviorSystemName)) { _engineSystems.BehaviorSystem.ProcessBehaviorUpdate(scene, gameTime); } foreach (var customSystem in _engineSystems.CustomSystems) { using (_performanceStatisticsRecorder.RecordSystemExecution(customSystem.Name)) { customSystem.ProcessUpdate(scene, gameTime); } } using (_performanceStatisticsRecorder.RecordSystemExecution(_engineSystems.PhysicsSystemName)) { _engineSystems.PhysicsSystem.PreparePhysicsDebugInformation(); } using (_performanceStatisticsRecorder.RecordSystemExecution(_engineSystems.AudioSystemName)) { _engineSystems.AudioSystem.ProcessAudio(scene); } using (_performanceStatisticsRecorder.RecordSystemExecution(_engineSystems.AnimationSystemName)) { _engineSystems.AnimationSystem.ProcessAnimations(scene, gameTime); } using (_performanceStatisticsRecorder.RecordSystemExecution(_engineSystems.RenderingSystemName)) { _engineSystems.RenderingSystem.RenderScene(scene); } using (_performanceStatisticsRecorder.RecordSystemExecution(_engineSystems.EntityDestructionSystemName)) { _engineSystems.EntityDestructionSystem.DestroyEntitiesAfterFullFrame(scene); } _performanceStatisticsRecorder.RecordFrame(); _coreDiagnosticInfoProvider.UpdateDiagnostics(scene); }