[Scummvm-git-logs] scummvm master -> 89384b9124dfc385626f9b3aebb7ef4ad19a38b1

peterkohaut peterkohaut at users.noreply.github.com
Wed Sep 4 21:30:45 CEST 2019


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
89384b9124 BLADERUNNER: Framelimiter simplification


Commit: 89384b9124dfc385626f9b3aebb7ef4ad19a38b1
    https://github.com/scummvm/scummvm/commit/89384b9124dfc385626f9b3aebb7ef4ad19a38b1
Author: Peter Kohaut (peter.kohaut at gmail.com)
Date: 2019-09-04T21:26:37+02:00

Commit Message:
BLADERUNNER: Framelimiter simplification

Changed paths:
    engines/bladerunner/bladerunner.cpp
    engines/bladerunner/bladerunner.h
    engines/bladerunner/framelimiter.cpp
    engines/bladerunner/framelimiter.h
    engines/bladerunner/outtake.cpp
    engines/bladerunner/outtake.h
    engines/bladerunner/ui/elevator.cpp
    engines/bladerunner/ui/elevator.h
    engines/bladerunner/ui/end_credits.cpp
    engines/bladerunner/ui/end_credits.h
    engines/bladerunner/ui/esper.cpp
    engines/bladerunner/ui/esper.h
    engines/bladerunner/ui/kia.cpp
    engines/bladerunner/ui/kia.h
    engines/bladerunner/ui/spinner.cpp
    engines/bladerunner/ui/spinner.h
    engines/bladerunner/ui/vk.cpp
    engines/bladerunner/ui/vk.h


diff --git a/engines/bladerunner/bladerunner.cpp b/engines/bladerunner/bladerunner.cpp
index b73afdd..fa0d79e 100644
--- a/engines/bladerunner/bladerunner.cpp
+++ b/engines/bladerunner/bladerunner.cpp
@@ -169,6 +169,7 @@ BladeRunnerEngine::BladeRunnerEngine(OSystem *syst, const ADGameDescription *des
 	_obstacles               = nullptr;
 	_sceneScript             = nullptr;
 	_time                    = nullptr;
+	_framelimiter            = nullptr;
 	_gameInfo                = nullptr;
 	_waypoints               = nullptr;
 	_gameVars                = nullptr;
@@ -217,7 +218,6 @@ BladeRunnerEngine::BladeRunnerEngine(OSystem *syst, const ADGameDescription *des
 		_actors[i]           = nullptr;
 	}
 	_debugger                = nullptr;
-	_mainLoopFrameLimiter    = nullptr;
 
 	walkingReset();
 
@@ -313,7 +313,6 @@ void BladeRunnerEngine::pauseEngineIntern(bool pause) {
 }
 
 Common::Error BladeRunnerEngine::run() {
-
 	Common::Array<Common::String> missingFiles;
 	if (!checkFiles(missingFiles)) {
 		Common::String missingFileStr = "";
@@ -340,7 +339,6 @@ Common::Error BladeRunnerEngine::run() {
 		return Common::Error(Common::kUnknownError, _("Failed to initialize resources"));
 	}
 
-
 	// improvement: Use a do-while() loop to handle the normal end-game state
 	// so that the game won't exit abruptly after end credits
 	do {
@@ -486,6 +484,8 @@ bool BladeRunnerEngine::startup(bool hasSavegames) {
 
 	_time = new Time(this);
 
+	_framelimiter = new Framelimiter(this);
+
 	// Try to load the SUBTITLES.MIX first, before Startup.MIX
 	// allows overriding any identically named resources (such as the original font files and as a bonus also the TRE files for the UI and dialogue menu)
 	_subtitles = new Subtitles(this);
@@ -529,8 +529,6 @@ bool BladeRunnerEngine::startup(bool hasSavegames) {
 	_cosTable1024 = new Common::CosineTable(1024); // 10-bits = 1024 points for 2*PI;
 	_sinTable1024 = new Common::SineTable(1024);
 
-	_mainLoopFrameLimiter = new Framelimiter(this, Framelimiter::kDefaultFpsRate, Framelimiter::kDefaultUseDelayMillis);
-
 	_view = new View();
 
 	_sceneObjects = new SceneObjects(this, _view);
@@ -898,6 +896,9 @@ void BladeRunnerEngine::shutdown() {
 		_subtitles = nullptr;
 	}
 
+	delete _framelimiter;
+	_framelimiter = nullptr;
+
 	delete _time;
 	_time = nullptr;
 
@@ -932,11 +933,6 @@ void BladeRunnerEngine::shutdown() {
 
 	delete _screenEffects;
 	_screenEffects = nullptr;
-
-	if (_mainLoopFrameLimiter) {
-		delete _mainLoopFrameLimiter;
-		_mainLoopFrameLimiter = nullptr;
-	}
 }
 
 bool BladeRunnerEngine::loadSplash() {
@@ -965,7 +961,6 @@ bool BladeRunnerEngine::isMouseButtonDown() const {
 
 void BladeRunnerEngine::gameLoop() {
 	_gameIsRunning = true;
-	_mainLoopFrameLimiter->init();
 	do {
 		if (_playerDead) {
 			playerDied();
@@ -980,7 +975,6 @@ void BladeRunnerEngine::gameTick() {
 	handleEvents();
 
 	if (!_gameIsRunning || !_windowIsActive) {
-		_mainLoopFrameLimiter->init();
 		return;
 	}
 
@@ -989,7 +983,6 @@ void BladeRunnerEngine::gameTick() {
 			Common::Error runtimeError = Common::Error(Common::kUnknownError, _("A required game resource was not found"));
 			GUI::MessageDialog dialog(runtimeError.getDesc());
 			dialog.runModal();
-			_mainLoopFrameLimiter->init();
 			return;
 		}
 	}
@@ -1124,12 +1117,8 @@ void BladeRunnerEngine::gameTick() {
 	 // Without this condition the game may flash back to the game screen
 	 // between and ending outtake and the end credits.
 	if (!_gameOver) {
-		if (_mainLoopFrameLimiter->shouldExecuteScreenUpdate()) {
-			blitToScreen(_surfaceFront);
-			_mainLoopFrameLimiter->postScreenUpdate();
-		}
+		blitToScreen(_surfaceFront);
 	}
-
 }
 
 void BladeRunnerEngine::actorsUpdate() {
@@ -2253,6 +2242,7 @@ void BladeRunnerEngine::ISez(const Common::String &str) {
 }
 
 void BladeRunnerEngine::blitToScreen(const Graphics::Surface &src) const {
+	_framelimiter->wait();
 	_system->copyRectToScreen(src.getPixels(), src.pitch, 0, 0, src.w, src.h);
 	_system->updateScreen();
 }
diff --git a/engines/bladerunner/bladerunner.h b/engines/bladerunner/bladerunner.h
index 5b59a09..ab11795 100644
--- a/engines/bladerunner/bladerunner.h
+++ b/engines/bladerunner/bladerunner.h
@@ -166,6 +166,7 @@ public:
 	SuspectsDatabase   *_suspectsDatabase;
 	Time               *_time;
 	View               *_view;
+	Framelimiter       *_framelimiter;
 	VK                 *_vk;
 	Waypoints          *_waypoints;
 	int                *_gameVars;
@@ -197,8 +198,6 @@ public:
 	Common::CosineTable *_cosTable1024;
 	Common::SineTable   *_sinTable1024;
 
-	Framelimiter *_mainLoopFrameLimiter;
-
 	bool _isWalkingInterruptible;
 	bool _interruptWalking;
 	bool _playerActorIdle;
diff --git a/engines/bladerunner/framelimiter.cpp b/engines/bladerunner/framelimiter.cpp
index 91277ba..9dea099 100644
--- a/engines/bladerunner/framelimiter.cpp
+++ b/engines/bladerunner/framelimiter.cpp
@@ -24,112 +24,48 @@
 
 #include "bladerunner/bladerunner.h"
 #include "bladerunner/time.h"
+
+#include "common/debug.h"
 #include "common/system.h"
 
 namespace BladeRunner {
 
-Framelimiter::Framelimiter(BladeRunnerEngine *vm, FramelimiterFpsRate framerateMode, bool useDelayMs) {
+Framelimiter::Framelimiter(BladeRunnerEngine *vm, uint fps) {
 	_vm = vm;
 
-//	// FUTURE: The frame limiter is disabled when vsync is enabled.
-//	_enabled = !_system->getFeatureState(OSystem::kFeatureVSync);
-	_enabled         = true;
-	_useDelayMs      = useDelayMs;
+	reset();
 
-	_speedLimitMs    = 0u;
-	uint32 framerate = 1u; // dummy init
-	switch (framerateMode) {
-	case kFramelimiter15fps:
-		framerate =  15u;
-		break;
-	case kFramelimiter25fps:
-		framerate =  25u;
-		break;
-	case kFramelimiter30fps:
-		framerate =  30u;
-		break;
-	case kFramelimiter60fps:
-		framerate =  60u;
-		break;
-	case kFramelimiter120fps:
-		framerate = 120u;
-		break;
-	case kFramelimiterDisabled:
-		// fall through
-	default:
+	if (fps > 0) {
+		_enabled = true;
+		_speedLimitMs = 1000 / fps;
+	} else {
 		_enabled = false;
-		break;
 	}
 
-	if (_enabled) {
-		_speedLimitMs = 1000 / CLIP<uint32>(framerate, 1, 120);
-	}
-
-	reset();
-}
-
-Framelimiter::~Framelimiter() { }
-
-void Framelimiter::init(bool forceScreenUpdate) {
-	reset();
-	_timeOfLastPass = _vm->_time->currentSystem();
-	_forceScreenUpdate = forceScreenUpdate;
-}
-
-uint32 Framelimiter::getLastFrameDuration() const {
-	return _lastFrameDurationMs;
+	_timeFrameStart = _vm->_time->currentSystem();
 }
 
-uint32 Framelimiter::getTimeOfCurrentPass() const {
-	return _timeOfCurrentPass;
-}
-
-uint32 Framelimiter::getTimeOfLastPass() const {
-	return _timeOfLastPass;
-}
+void Framelimiter::wait() {
+	// TODO: when vsync will be supported, use it
 
-bool Framelimiter::shouldExecuteScreenUpdate() {
-	bool shouldUpdateScreen = true;
-	_timeOfCurrentPass = _vm->_time->currentSystem();
-	if (_enabled) {
-		if (_useDelayMs) {
-			// _timeOfCurrentPass is used to calculate the duration that the current frame is on screen so far
-			uint32 frameDuration = _timeOfCurrentPass - _startFrameTime;
-			if (frameDuration < _speedLimitMs) {
-				_vm->_system->delayMillis(_speedLimitMs - frameDuration);
-				// cheaper than calling _vm->_time->currentSystem() again
-				_timeOfCurrentPass += (_speedLimitMs - frameDuration);
-			}
-		}
-
-		shouldUpdateScreen = ((_timeOfCurrentPass - _timeOfLastPass) >= _speedLimitMs) || _forceScreenUpdate || _useDelayMs;
-
-		if (shouldUpdateScreen) {
-			if (_forceScreenUpdate) {
-				_forceScreenUpdate = false;
-			}
-			_lastFrameDurationMs = _timeOfCurrentPass - _startFrameTime;
-			_startFrameTime = _timeOfCurrentPass;
-		}
+	if (!_enabled) {
+		return;
 	}
-	return shouldUpdateScreen;
-}
 
-void  Framelimiter::postScreenUpdate() {
-	_timeOfLastPass = _timeOfCurrentPass;
-//	if (_enabled) {
-//		// for debug purposes, this calculates the time between deciding to draw the frame, and the time after drawing the update to the screen
-//		uint32 endFrameTime = _vm->_time->currentSystem();
-//		uint32 frameDuration = endFrameTime - _startFrameTime;
-//	}
+	uint32 timeNow = _vm->_time->currentSystem();
+	uint32 frameDuration = timeNow - _timeFrameStart;
+	if (frameDuration < _speedLimitMs) {
+		uint32 wait = _speedLimitMs - frameDuration;
+		_vm->_system->delayMillis(wait);
+		timeNow += wait;
+	}
+	// debug("frametime %i ms", timeNow - _timeFrameStart);
+	// using _vm->_time->currentSystem() here is slower and causes some shutters
+	_timeFrameStart = timeNow;
 }
 
 void Framelimiter::reset() {
-	_forceScreenUpdate   = false;
-	_timeOfLastPass      = 0u;
-	_timeOfCurrentPass   = 0u;
-	_startFrameTime      = 0u;
-	_lastFrameDurationMs = _speedLimitMs;
+	_timeFrameStart = 0u;
 }
 
 } // End of namespace BladeRunner
diff --git a/engines/bladerunner/framelimiter.h b/engines/bladerunner/framelimiter.h
index 0324570..a36e208 100644
--- a/engines/bladerunner/framelimiter.h
+++ b/engines/bladerunner/framelimiter.h
@@ -27,56 +27,23 @@
 
 namespace BladeRunner {
 
-enum FramelimiterFpsRate {
-	kFramelimiterDisabled       = 0,
-	kFramelimiter15fps          = 1,
-	kFramelimiter25fps          = 2,
-	kFramelimiter30fps          = 3,
-	kFramelimiter60fps          = 4,
-	kFramelimiter120fps         = 5
-};
-
 class BladeRunnerEngine;
 
 class Framelimiter {
 	friend class Debugger;
 
-public:
-	static const FramelimiterFpsRate kDefaultFpsRate = kFramelimiter60fps;
-	static const bool kDefaultUseDelayMillis = true;
-
 private:
 	BladeRunnerEngine *_vm;
 
-	bool   _forceScreenUpdate;
+	bool   _enabled;
 	uint32 _speedLimitMs;
 
-	// A pass is when a tick or while loop that contains a potential screen update is repeated
-	// it's essentially when the check is made for a screen update
-	// Not every pass will necessarily result in a screen update (because that's the purpose of the frame limiter)
-	// So the "_startFrameTime" is not always equal to "_timeOfCurrentPass"
-	uint32 _timeOfLastPass;
-	uint32 _timeOfCurrentPass;
-
-	uint32 _startFrameTime;      // is updated and valid, only if the current pass will result in a screen update (see method: shouldExecuteScreenUpdate())
-	uint32 _lastFrameDurationMs; // can be used for average FPS calculation and display purposes when frame limiter is enabled
-
-	bool   _enabled;
-	bool   _useDelayMs;          // true: will use calls to delayMillis(), false: will use non-blocking software timer instead
+	uint32 _timeFrameStart;
 
 public:
-	Framelimiter(BladeRunnerEngine *vm, FramelimiterFpsRate framerateMode, bool useDelayMs);
-	~Framelimiter();
-
-//	void pause(bool pause);
-
-	void init(bool forceScreenUpdate = true);
-	uint32 getLastFrameDuration() const;
-	uint32 getTimeOfCurrentPass() const;
-	uint32 getTimeOfLastPass() const;
+	Framelimiter(BladeRunnerEngine *vm, uint fps = 60);
 
-	bool shouldExecuteScreenUpdate();
-	void postScreenUpdate();
+	void wait();
 
 private:
 	void reset();
diff --git a/engines/bladerunner/outtake.cpp b/engines/bladerunner/outtake.cpp
index 2f49099..03192d6 100644
--- a/engines/bladerunner/outtake.cpp
+++ b/engines/bladerunner/outtake.cpp
@@ -24,7 +24,6 @@
 
 #include "bladerunner/bladerunner.h"
 #include "bladerunner/chapters.h"
-#include "bladerunner/framelimiter.h"
 #include "bladerunner/subtitles.h"
 #include "bladerunner/vqa_player.h"
 #include "bladerunner/time.h"
@@ -38,16 +37,10 @@ namespace BladeRunner {
 OuttakePlayer::OuttakePlayer(BladeRunnerEngine *vm) {
 	_vm = vm;
 	_surfaceVideo.create(_vm->_surfaceBack.w, _vm->_surfaceBack.h, _vm->_surfaceBack.format);
-	_framelimiter = new Framelimiter(_vm, Framelimiter::kDefaultFpsRate, Framelimiter::kDefaultUseDelayMillis);
 }
 
 OuttakePlayer::~OuttakePlayer() {
 	_surfaceVideo.free();
-
-	if (_framelimiter) {
-		delete _framelimiter;
-		_framelimiter = nullptr;
-	}
 }
 
 void OuttakePlayer::play(const Common::String &name, bool noLocalization, int container) {
@@ -77,17 +70,10 @@ void OuttakePlayer::play(const Common::String &name, bool noLocalization, int co
 	_vm->_vqaIsPlaying = true;
 	_vm->_vqaStopIsRequested = false;
 
-	_framelimiter->init();
-
 	while (!_vm->_vqaStopIsRequested && !_vm->shouldQuit()) {
 		_vm->handleEvents();
 
 		if (!_vm->_windowIsActive) {
-			_framelimiter->init();
-			continue;
-		}
-
-		if (!_framelimiter->shouldExecuteScreenUpdate()) {
 			continue;
 		}
 
@@ -102,7 +88,6 @@ void OuttakePlayer::play(const Common::String &name, bool noLocalization, int co
 			_vm->_subtitles->tickOuttakes(_vm->_surfaceFront);
 			_vm->blitToScreen(_vm->_surfaceFront);
 		}
-		_framelimiter->postScreenUpdate();
 	}
 
 	_vm->_vqaIsPlaying = false;
diff --git a/engines/bladerunner/outtake.h b/engines/bladerunner/outtake.h
index 0305e80..d01bc34 100644
--- a/engines/bladerunner/outtake.h
+++ b/engines/bladerunner/outtake.h
@@ -30,11 +30,9 @@
 namespace BladeRunner {
 
 class BladeRunnerEngine;
-class Framelimiter;
 
 class OuttakePlayer {
 	BladeRunnerEngine *_vm;
-	Framelimiter      *_framelimiter;
 
 	Graphics::Surface  _surfaceVideo;
 
diff --git a/engines/bladerunner/ui/elevator.cpp b/engines/bladerunner/ui/elevator.cpp
index d01acc2..cff2a16 100644
--- a/engines/bladerunner/ui/elevator.cpp
+++ b/engines/bladerunner/ui/elevator.cpp
@@ -25,7 +25,6 @@
 #include "bladerunner/actor.h"
 #include "bladerunner/bladerunner.h"
 #include "bladerunner/audio_player.h"
-#include "bladerunner/framelimiter.h"
 #include "bladerunner/game_info.h"
 #include "bladerunner/mouse.h"
 #include "bladerunner/shape.h"
@@ -45,17 +44,11 @@ Elevator::Elevator(BladeRunnerEngine *vm) {
 	_vm = vm;
 	reset();
 	_imagePicker = new UIImagePicker(vm, 8);
-	_framelimiter = new Framelimiter(_vm, Framelimiter::kDefaultFpsRate, Framelimiter::kDefaultUseDelayMillis);
 }
 
 Elevator::~Elevator() {
 	delete _imagePicker;
 	_imagePicker = nullptr;
-
-	if (_framelimiter) {
-		delete _framelimiter;
-		_framelimiter = nullptr;
-	}
 }
 
 int Elevator::activate(int elevatorId) {
@@ -194,7 +187,6 @@ int Elevator::activate(int elevatorId) {
 void Elevator::open() {
 	resetDescription();
 	_isOpen = true;
-	_framelimiter->init();
 }
 
 bool Elevator::isOpen() const {
@@ -213,35 +205,32 @@ int Elevator::handleMouseDown(int x, int y) {
 
 void Elevator::tick() {
 	if (!_vm->_windowIsActive) {
-		_framelimiter->init();
 		return;
 	}
 
-	if (_framelimiter->shouldExecuteScreenUpdate()) {
-		int frame = _vqaPlayer->update();
-		assert(frame >= -1);
+	int frame = _vqaPlayer->update();
+	assert(frame >= -1);
+
+	// vqaPlayer renders to _surfaceBack
+	blit(_vm->_surfaceBack, _vm->_surfaceFront);
 
-		// vqaPlayer renders to _surfaceBack
-		blit(_vm->_surfaceBack, _vm->_surfaceFront);
+	Common::Point p = _vm->getMousePos();
 
-		Common::Point p = _vm->getMousePos();
+	// TODO(madmoose): BLADE.EXE has hasHoveredImage before handleMouseAction?
+	_imagePicker->handleMouseAction(p.x, p.y, false, false, false);
+	if (_imagePicker->hasHoveredImage()) {
+		_vm->_mouse->setCursor(1);
+	} else {
+		_vm->_mouse->setCursor(0);
+	}
 
-		// TODO(madmoose): BLADE.EXE has hasHoveredImage before handleMouseAction?
-		_imagePicker->handleMouseAction(p.x, p.y, false, false, false);
-		if (_imagePicker->hasHoveredImage()) {
-			_vm->_mouse->setCursor(1);
-		} else {
-			_vm->_mouse->setCursor(0);
-		}
+	_imagePicker->draw(_vm->_surfaceFront);
+	_vm->_mouse->draw(_vm->_surfaceFront, p.x, p.y);
 
-		_imagePicker->draw(_vm->_surfaceFront);
-		_vm->_mouse->draw(_vm->_surfaceFront, p.x, p.y);
+	_vm->_subtitles->tick(_vm->_surfaceFront);
 
-		_vm->_subtitles->tick(_vm->_surfaceFront);
+	_vm->blitToScreen(_vm->_surfaceFront);
 
-		_vm->blitToScreen(_vm->_surfaceFront);
-		_framelimiter->postScreenUpdate();
-	}
 	tickDescription();
 }
 
diff --git a/engines/bladerunner/ui/elevator.h b/engines/bladerunner/ui/elevator.h
index c64152c..6ed91ce 100644
--- a/engines/bladerunner/ui/elevator.h
+++ b/engines/bladerunner/ui/elevator.h
@@ -28,14 +28,12 @@
 namespace BladeRunner {
 
 class BladeRunnerEngine;
-class Framelimiter;
 class Shape;
 class VQAPlayer;
 class UIImagePicker;
 
 class Elevator {
 	BladeRunnerEngine     *_vm;
-	Framelimiter          *_framelimiter;
 	bool                   _isOpen;
 	VQAPlayer             *_vqaPlayer;
 	int                    _buttonClicked;
diff --git a/engines/bladerunner/ui/end_credits.cpp b/engines/bladerunner/ui/end_credits.cpp
index 291014c..b609e2e 100644
--- a/engines/bladerunner/ui/end_credits.cpp
+++ b/engines/bladerunner/ui/end_credits.cpp
@@ -29,7 +29,6 @@
 #include "bladerunner/game_constants.h"
 #include "bladerunner/ambient_sounds.h"
 #include "bladerunner/audio_speech.h"
-#include "bladerunner/framelimiter.h"
 #include "bladerunner/font.h"
 #include "bladerunner/game_info.h"
 #include "bladerunner/mouse.h"
@@ -42,14 +41,9 @@ namespace BladeRunner {
 
 EndCredits::EndCredits(BladeRunnerEngine *vm) {
 	_vm = vm;
-	_framelimiter = new Framelimiter(_vm, Framelimiter::kDefaultFpsRate, Framelimiter::kDefaultUseDelayMillis);
 }
 
 EndCredits::~EndCredits() {
-	if (_framelimiter) {
-		delete _framelimiter;
-		_framelimiter = nullptr;
-	}
 }
 
 void EndCredits::show() {
@@ -98,7 +92,7 @@ void EndCredits::show() {
 	_vm->_vqaStopIsRequested = false;
 
 	double position = 0.0;
-	_framelimiter->init();
+	uint32 timeLast = _vm->_time->currentSystem();
 
 	while (!_vm->_vqaStopIsRequested && !_vm->shouldQuit()) {
 		if (position >= textPositions[textCount - 1]) {
@@ -109,15 +103,13 @@ void EndCredits::show() {
 		_vm->handleEvents();
 
 		if (!_vm->_windowIsActive) {
-			_framelimiter->init();
-			continue;
-		}
-
-		if (!_framelimiter->shouldExecuteScreenUpdate()) {
+			timeLast = _vm->_time->currentSystem();
 			continue;
 		}
 
-		position += (double)(_framelimiter->getTimeOfCurrentPass() - _framelimiter->getTimeOfLastPass()) * 0.05f; // unsigned difference is intentional
+		uint32 timeNow = _vm->_time->currentSystem();
+		position += (double)(timeNow - timeLast) * 0.05f; // unsigned difference is intentional
+		timeLast = timeNow;
 
 		_vm->_surfaceFront.fillRect(Common::Rect(640, 480), 0);
 
@@ -154,7 +146,6 @@ void EndCredits::show() {
 		_vm->_surfaceFront.fillRect(Common::Rect(0, 452, 640, 480), 0);
 
 		_vm->blitToScreen(_vm->_surfaceFront);
-		_framelimiter->postScreenUpdate();
 	}
 
 	_vm->_vqaIsPlaying = false;
diff --git a/engines/bladerunner/ui/end_credits.h b/engines/bladerunner/ui/end_credits.h
index 6c45adf..39086cd 100644
--- a/engines/bladerunner/ui/end_credits.h
+++ b/engines/bladerunner/ui/end_credits.h
@@ -26,11 +26,9 @@
 namespace BladeRunner {
 
 class BladeRunnerEngine;
-class Framelimiter;
 
 class EndCredits {
 	BladeRunnerEngine *_vm;
-	Framelimiter      *_framelimiter;
 
 public:
 	EndCredits(BladeRunnerEngine *vm);
diff --git a/engines/bladerunner/ui/esper.cpp b/engines/bladerunner/ui/esper.cpp
index f5257bf..fe59805 100644
--- a/engines/bladerunner/ui/esper.cpp
+++ b/engines/bladerunner/ui/esper.cpp
@@ -28,7 +28,6 @@
 #include "bladerunner/bladerunner.h"
 #include "bladerunner/debugger.h"
 #include "bladerunner/decompress_lcw.h"
-#include "bladerunner/framelimiter.h"
 #include "bladerunner/font.h"
 #include "bladerunner/game_info.h"
 #include "bladerunner/mouse.h"
@@ -67,17 +66,11 @@ ESPER::ESPER(BladeRunnerEngine *vm) {
 	reset();
 
 	_buttons = new UIImagePicker(vm, kPhotoCount + 4);
-	_framelimiter = new Framelimiter(_vm, Framelimiter::kDefaultFpsRate, Framelimiter::kDefaultUseDelayMillis);
 }
 
 ESPER::~ESPER() {
 	delete _buttons;
 	reset();
-
-	if (_framelimiter) {
-		delete _framelimiter;
-		_framelimiter = nullptr;
-	}
 }
 
 void ESPER::open(Graphics::Surface *surface) {
@@ -122,8 +115,6 @@ void ESPER::open(Graphics::Surface *surface) {
 	_vqaPlayerMain->setLoop(2, -1, kLoopSetModeJustStart, nullptr, nullptr);
 
 	_isOpen = true;
-	_framelimiter->init();
-
 	_flash = false;
 
 	_script = new ESPERScript(_vm);
@@ -216,35 +207,30 @@ void ESPER::handleMouseDown(int x, int y, bool mainButton) {
 
 void ESPER::tick() {
 	if (!_vm->_windowIsActive) {
-		_framelimiter->init();
 		return;
 	}
 
-	if (_framelimiter->shouldExecuteScreenUpdate()) {
-		tickSound();
+	tickSound();
 
-		blit(_vm->_surfaceBack, _vm->_surfaceFront);
+	blit(_vm->_surfaceBack, _vm->_surfaceFront);
 
-		int mouseX, mouseY;
-		_vm->_mouse->getXY(&mouseX, &mouseY);
-		if (!_vm->_mouse->isDisabled()) {
-			_buttons->handleMouseAction(mouseX, mouseY, false, false, false);
-		}
-
-		if (!_isOpen) {
-			return;
-		}
+	int mouseX, mouseY;
+	_vm->_mouse->getXY(&mouseX, &mouseY);
+	if (!_vm->_mouse->isDisabled()) {
+		_buttons->handleMouseAction(mouseX, mouseY, false, false, false);
+	}
 
-		draw(_vm->_surfaceFront);
-		_buttons->draw(_vm->_surfaceFront);
-		drawMouse(_vm->_surfaceFront);
+	if (!_isOpen) {
+		return;
+	}
 
-		tickSound();
-		_vm->_subtitles->tick(_vm->_surfaceFront);
-		_vm->blitToScreen(_vm->_surfaceFront);
+	draw(_vm->_surfaceFront);
+	_buttons->draw(_vm->_surfaceFront);
+	drawMouse(_vm->_surfaceFront);
 
-		_framelimiter->postScreenUpdate();
-	}
+	tickSound();
+	_vm->_subtitles->tick(_vm->_surfaceFront);
+	_vm->blitToScreen(_vm->_surfaceFront);
 
 	if (_statePhoto == kEsperPhotoStateVideoShow) {
 		if (_regionSelectedAck)	{
diff --git a/engines/bladerunner/ui/esper.h b/engines/bladerunner/ui/esper.h
index 818d51c..0c1c6a8 100644
--- a/engines/bladerunner/ui/esper.h
+++ b/engines/bladerunner/ui/esper.h
@@ -31,7 +31,6 @@
 namespace BladeRunner {
 
 class BladeRunnerEngine;
-class Framelimiter;
 class Font;
 class Shape;
 class VQAPlayer;
@@ -88,7 +87,6 @@ class ESPER {
 	};
 
 	BladeRunnerEngine     *_vm;
-	Framelimiter          *_framelimiter;
 	ESPERScript           *_script;
 
 	bool _isWaiting;
diff --git a/engines/bladerunner/ui/kia.cpp b/engines/bladerunner/ui/kia.cpp
index 501a1e7..3e9011e 100644
--- a/engines/bladerunner/ui/kia.cpp
+++ b/engines/bladerunner/ui/kia.cpp
@@ -26,7 +26,6 @@
 #include "bladerunner/audio_player.h"
 #include "bladerunner/bladerunner.h"
 #include "bladerunner/combat.h"
-#include "bladerunner/framelimiter.h"
 #include "bladerunner/font.h"
 #include "bladerunner/game_constants.h"
 #include "bladerunner/game_flags.h"
@@ -81,6 +80,7 @@ KIA::KIA(BladeRunnerEngine *vm) {
 	_playerPhotograph = nullptr;
 	_playerSliceModelId = -1;
 	_playerSliceModelAngle = 0.0f;
+	_timeLast = _vm->_time->currentSystem();
 	_playerActorDialogueQueuePosition = 0;
 	_playerActorDialogueQueueSize = 0;
 	_playerActorDialogueState = 0;
@@ -110,9 +110,6 @@ KIA::KIA(BladeRunnerEngine *vm) {
 		_playerActorDialogueQueue[i].actorId    = -1;
 		_playerActorDialogueQueue[i].sentenceId = -1;
 	}
-
-	_framelimiter = new Framelimiter(_vm, Framelimiter::kDefaultFpsRate, Framelimiter::kDefaultUseDelayMillis);
-	_framelimiter->init();
 }
 
 KIA::~KIA() {
@@ -136,11 +133,6 @@ KIA::~KIA() {
 	delete _shapes;
 	delete _log;
 	delete _script;
-
-	if (_framelimiter) {
-		delete _framelimiter;
-		_framelimiter = nullptr;
-	}
 }
 
 void KIA::reset() {
@@ -238,13 +230,9 @@ void KIA::tick() {
 		return;
 	}
 
-	if (!_framelimiter->shouldExecuteScreenUpdate()) {
-		return;
-	}
-
-	uint32 timeNow = _framelimiter->getTimeOfCurrentPass();
+	uint32 timeNow = _vm->_time->currentSystem();
 	// unsigned difference is intentional
-	uint32 timeDiff = timeNow - _framelimiter->getTimeOfLastPass();
+	uint32 timeDiff = timeNow - _timeLast;
 
 	if (_playerActorDialogueQueueSize == _playerActorDialogueQueuePosition) {
 		_playerActorDialogueState = 0;
@@ -396,7 +384,7 @@ void KIA::tick() {
 
 	_vm->blitToScreen(_vm->_surfaceFront);
 
-	_framelimiter->postScreenUpdate();
+	_timeLast = timeNow;
 }
 
 void KIA::resume() {
@@ -691,8 +679,7 @@ void KIA::init() {
 	playerReset();
 	_playerVqaFrame = 0;
 	_playerVqaTimeLast = _vm->_time->currentSystem();
-
-	_framelimiter->init();
+	_timeLast = _vm->_time->currentSystem();
 
 	if (_vm->_gameFlags->query(kFlagKIAPrivacyAddon) && !_vm->_gameFlags->query(kFlagKIAPrivacyAddonIntro)) {
 		_vm->_gameFlags->set(kFlagKIAPrivacyAddonIntro);
diff --git a/engines/bladerunner/ui/kia.h b/engines/bladerunner/ui/kia.h
index fdc4d8e..2a87f5d 100644
--- a/engines/bladerunner/ui/kia.h
+++ b/engines/bladerunner/ui/kia.h
@@ -34,7 +34,6 @@ struct KeyState;
 namespace BladeRunner {
 
 class BladeRunnerEngine;
-class Framelimiter;
 class KIALog;
 class KIAScript;
 class KIASectionBase;
@@ -76,7 +75,6 @@ class KIA {
 	};
 
 	BladeRunnerEngine *_vm;
-	Framelimiter      *_framelimiter;
 
 	int _transitionId;
 
@@ -89,7 +87,7 @@ class KIA {
 	int                _playerSliceModelId;
 	float              _playerSliceModelAngle;
 	Graphics::Surface  _playerImage;
-//	uint32             _timeLast;
+	uint32             _timeLast;
 
 	ActorDialogueQueueEntry _playerActorDialogueQueue[kPlayerActorDialogueQueueCapacity];
 	int                     _playerActorDialogueQueuePosition;
diff --git a/engines/bladerunner/ui/spinner.cpp b/engines/bladerunner/ui/spinner.cpp
index 85d2c37..27116a8 100644
--- a/engines/bladerunner/ui/spinner.cpp
+++ b/engines/bladerunner/ui/spinner.cpp
@@ -28,7 +28,6 @@
 #include "bladerunner/ambient_sounds.h"
 #include "bladerunner/game_info.h"
 #include "bladerunner/subtitles.h"
-#include "bladerunner/framelimiter.h"
 #include "bladerunner/game_constants.h"
 #include "bladerunner/mouse.h"
 #include "bladerunner/savefile.h"
@@ -49,7 +48,6 @@ Spinner::Spinner(BladeRunnerEngine *vm) {
 	reset();
 	_imagePicker = new UIImagePicker(vm, kSpinnerDestinations);
 	_vqaPlayer = nullptr;
-	_framelimiter = new Framelimiter(_vm, Framelimiter::kDefaultFpsRate, Framelimiter::kDefaultUseDelayMillis);
 }
 
 Spinner::~Spinner() {
@@ -61,11 +59,6 @@ Spinner::~Spinner() {
 		_vqaPlayer->close();
 		delete _vqaPlayer;
 	}
-
-	if (_framelimiter) {
-		delete _framelimiter;
-		_framelimiter = nullptr;
-	}
 }
 
 void Spinner::setSelectableDestinationFlag(int destination, bool selectable) {
@@ -237,7 +230,6 @@ void Spinner::mouseUpCallback(int destinationImage, void *self) {
 
 void Spinner::open() {
 	_isOpen = true;
-	_framelimiter->init();
 }
 
 bool Spinner::isOpen() const {
@@ -256,35 +248,30 @@ int Spinner::handleMouseDown(int x, int y) {
 
 void Spinner::tick() {
 	if (!_vm->_windowIsActive) {
-		_framelimiter->init();
 		return;
 	}
 
-	if (_framelimiter->shouldExecuteScreenUpdate()) {
-		int frame = _vqaPlayer->update();
-		assert(frame >= -1);
+	int frame = _vqaPlayer->update();
+	assert(frame >= -1);
 
-		// vqaPlayer renders to _surfaceBack
-		blit(_vm->_surfaceBack, _vm->_surfaceFront);
-
-		Common::Point p = _vm->getMousePos();
-		_imagePicker->handleMouseAction(p.x, p.y, false, false, false);
-		if (_imagePicker->hasHoveredImage()) {
-			_vm->_mouse->setCursor(1);
-		} else {
-			_vm->_mouse->setCursor(0);
-		}
-		_imagePicker->draw(_vm->_surfaceFront);
-		_vm->_mouse->draw(_vm->_surfaceFront, p.x, p.y);
-		_imagePicker->drawTooltip(_vm->_surfaceFront, p.x, p.y);
+	// vqaPlayer renders to _surfaceBack
+	blit(_vm->_surfaceBack, _vm->_surfaceFront);
 
-		if (_vm->_cutContent) {
-			_vm->_subtitles->tick(_vm->_surfaceFront);
-		}
-		_vm->blitToScreen(_vm->_surfaceFront);
-		_framelimiter->postScreenUpdate();
+	Common::Point p = _vm->getMousePos();
+	_imagePicker->handleMouseAction(p.x, p.y, false, false, false);
+	if (_imagePicker->hasHoveredImage()) {
+		_vm->_mouse->setCursor(1);
+	} else {
+		_vm->_mouse->setCursor(0);
+	}
+	_imagePicker->draw(_vm->_surfaceFront);
+	_vm->_mouse->draw(_vm->_surfaceFront, p.x, p.y);
+	_imagePicker->drawTooltip(_vm->_surfaceFront, p.x, p.y);
 
+	if (_vm->_cutContent) {
+		_vm->_subtitles->tick(_vm->_surfaceFront);
 	}
+	_vm->blitToScreen(_vm->_surfaceFront);
 
 	if (_vm->_cutContent) {
 		tickDescription();
diff --git a/engines/bladerunner/ui/spinner.h b/engines/bladerunner/ui/spinner.h
index 78c2943..2fa0dc6 100644
--- a/engines/bladerunner/ui/spinner.h
+++ b/engines/bladerunner/ui/spinner.h
@@ -29,7 +29,6 @@
 namespace BladeRunner {
 
 class BladeRunnerEngine;
-class Framelimiter;
 class SaveFileReadStream;
 class SaveFileWriteStream;
 class Shape;
@@ -45,7 +44,6 @@ class Spinner {
 	};
 
 	BladeRunnerEngine      *_vm;
-	Framelimiter           *_framelimiter;
 	bool                    _isDestinationSelectable[kSpinnerDestinations];
 	bool                    _isOpen;
 	VQAPlayer              *_vqaPlayer;
diff --git a/engines/bladerunner/ui/vk.cpp b/engines/bladerunner/ui/vk.cpp
index 7e24b79..245bae9 100644
--- a/engines/bladerunner/ui/vk.cpp
+++ b/engines/bladerunner/ui/vk.cpp
@@ -27,7 +27,6 @@
 #include "bladerunner/audio_player.h"
 #include "bladerunner/bladerunner.h"
 #include "bladerunner/combat.h"
-#include "bladerunner/framelimiter.h"
 #include "bladerunner/font.h"
 #include "bladerunner/game_constants.h"
 #include "bladerunner/game_flags.h"
@@ -54,16 +53,10 @@ VK::VK(BladeRunnerEngine *vm) {
 	_vm = vm;
 
 	reset();
-	_framelimiter = new Framelimiter(_vm, Framelimiter::kDefaultFpsRate, Framelimiter::kDefaultUseDelayMillis);
 }
 
 VK::~VK() {
 	reset();
-
-	if (_framelimiter) {
-		delete _framelimiter;
-		_framelimiter = nullptr;
-	}
 }
 
 void VK::open(int actorId, int calibrationRatio) {
@@ -133,7 +126,6 @@ void VK::open(int actorId, int calibrationRatio) {
 	}
 
 	_isOpen = true;
-	_framelimiter->init();
 
 	_script = new VKScript(_vm);
 
@@ -198,31 +190,27 @@ void VK::close() {
 }
 
 void VK::tick() {
+	int mouseX, mouseY;
+	_vm->_mouse->getXY(&mouseX, &mouseY);
+	if (!_vm->_mouse->isDisabled()) {
+		_buttons->handleMouseAction(mouseX, mouseY, false, false, false);
+	}
 
-	if (_framelimiter->shouldExecuteScreenUpdate()) {
-		int mouseX, mouseY;
-		_vm->_mouse->getXY(&mouseX, &mouseY);
-		if (!_vm->_mouse->isDisabled()) {
-			_buttons->handleMouseAction(mouseX, mouseY, false, false, false);
-		}
-
-		draw();
+	draw();
 
-		if ( _vm->_debugger->_showStatsVk
-			&& !_vm->_actors[_actorId]->isSpeeching()
-			&& !_vm->_actors[kActorMcCoy]->isSpeeching()
-			&& !_vm->_actors[kActorAnsweringMachine]->isSpeeching()
-			&& !_isClosing
-		) {
-			_vm->_subtitles->setGameSubsText(Common::String::format("Calibration: %02d Ratio: %02d Anxiety: %02d%%\nReplicant: %02d%% Human: %02d%%", _calibration, _calibrationRatio, _anxiety, _replicantProbability, _humanProbability), true);
-			_vm->_subtitles->show();
-		}
+	if ( _vm->_debugger->_showStatsVk
+		&& !_vm->_actors[_actorId]->isSpeeching()
+		&& !_vm->_actors[kActorMcCoy]->isSpeeching()
+		&& !_vm->_actors[kActorAnsweringMachine]->isSpeeching()
+		&& !_isClosing
+	) {
+		_vm->_subtitles->setGameSubsText(Common::String::format("Calibration: %02d Ratio: %02d Anxiety: %02d%%\nReplicant: %02d%% Human: %02d%%", _calibration, _calibrationRatio, _anxiety, _replicantProbability, _humanProbability), true);
+		_vm->_subtitles->show();
+	}
 
-		_vm->_subtitles->tick(_vm->_surfaceFront);
+	_vm->_subtitles->tick(_vm->_surfaceFront);
 
-		_vm->blitToScreen(_vm->_surfaceFront);
-		_framelimiter->postScreenUpdate();
-	}
+	_vm->blitToScreen(_vm->_surfaceFront);
 
 	// unsigned difference is intentional
 	if (_isClosing && (_vm->_time->current() - _timeCloseStart >= 3000u) && !_script->isInsideScript()) {
diff --git a/engines/bladerunner/ui/vk.h b/engines/bladerunner/ui/vk.h
index a880204..eeaee1b 100644
--- a/engines/bladerunner/ui/vk.h
+++ b/engines/bladerunner/ui/vk.h
@@ -31,7 +31,6 @@
 namespace BladeRunner {
 
 class BladeRunnerEngine;
-class Framelimiter;
 class VKScript;
 class Shape;
 class UIImagePicker;
@@ -48,7 +47,6 @@ class VK {
 	};
 
 	BladeRunnerEngine *_vm;
-	Framelimiter      *_framelimiter;
 
 	VKScript *_script;
 





More information about the Scummvm-git-logs mailing list