[Scummvm-git-logs] scummvm master -> 04cd1dccf9458e75fb146bffe1545fbfa5ed1862

moralrecordings noreply at scummvm.org
Sun Jan 21 01:28:13 UTC 2024


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:
04cd1dccf9 DIRECTOR: Score: restrict _curFrameNumber updates


Commit: 04cd1dccf9458e75fb146bffe1545fbfa5ed1862
    https://github.com/scummvm/scummvm/commit/04cd1dccf9458e75fb146bffe1545fbfa5ed1862
Author: threefins (threefins at gardenizr.com)
Date: 2024-01-21T09:26:08+08:00

Commit Message:
DIRECTOR: Score: restrict _curFrameNumber updates

When `Score::loadFrame(frameNum)` is called with frameNum <=
_curFrameNumber it will start by resetting frame state, then loading
previous n-l frames and then updating `_curFrameNumber to` `frameNum`.
This is by design, to allow abribtrary script-based frame jumping and debug console commands.

Previous to this change `Score::update()` incrementing `_curFrameNumber` directly before
calling `Score::loadFrame(_curFrameNumber)`. In effect, this meant that
every time the playhead moved forward one frame, all previous frames
would first be loaded from the stream first. Any state built
up by previous scripting is lost and perhaps impacts performance at
suitably high frame counts and debug levels.

In this change, `Score::update()` instead makes changes to a local
variable and passes the result to `Score::loadFrame()`.

Changed paths:
    engines/director/score.cpp


diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 1dcb20d429d..c03350e519d 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -400,22 +400,21 @@ void Score::update() {
 	for (uint ch = 0; ch < _channels.size(); ch++)
 		*_currentFrame->_sprites[ch] = *_channels[ch]->_sprite;
 
-	bool frameChanged = false;
+	uint32 nextFrameNumberToLoad = _curFrameNumber;
 
 	if (!_vm->_playbackPaused) {
 		if (_nextFrame) {
 			// With the advent of demand loading frames and due to partial updates, we rebuild our channel data
 			// when jumping.
-			_curFrameNumber = _nextFrame;
+			nextFrameNumberToLoad = _nextFrame;
 		}
 		else if (!_window->_newMovieStarted)
-			_curFrameNumber++;
-		frameChanged = true;
+			nextFrameNumberToLoad = (_curFrameNumber+1);
 	}
 
 	_nextFrame = 0;
 
-	if (_curFrameNumber >= getFramesNum()) {
+	if (nextFrameNumberToLoad >= getFramesNum()) {
 		Window *window = _vm->getCurrentWindow();
 		if (!window->_movieStack.empty()) {
 			MovieReference ref = window->_movieStack.back();
@@ -427,8 +426,7 @@ void Score::update() {
 				processFrozenScripts();
 				return;
 			}
-
-			_curFrameNumber = ref.frameI;
+			nextFrameNumberToLoad = ref.frameI;
 		} else {
 			if (debugChannelSet(-1, kDebugNoLoop)) {
 				_playState = kPlayStopped;
@@ -436,21 +434,21 @@ void Score::update() {
 				return;
 			}
 
-			_curFrameNumber = 1;
+			nextFrameNumberToLoad = 1;
 		}
-		frameChanged = true;
 	}
 
 	if (_labels != nullptr) {
 		for (auto &i : *_labels) {
-			if (i->number == _curFrameNumber) {
-				_currentLabel = _curFrameNumber;
+			if (i->number == nextFrameNumberToLoad) {
+				_currentLabel = nextFrameNumberToLoad;
 			}
 		}
 	}
 
-	if (frameChanged) {
-		loadFrame(_curFrameNumber, true);
+	if (_curFrameNumber != nextFrameNumberToLoad) {
+		// this updates _curFrameNumber
+		loadFrame(nextFrameNumberToLoad, true);
 	}
 
 	byte tempo = _currentFrame->_mainChannels.scoreCachedTempo;
@@ -1489,7 +1487,7 @@ void Score::loadFrames(Common::SeekableReadStreamEndian &stream, uint16 version)
 }
 
 bool Score::loadFrame(int frameNum, bool loadCast) {
-	debugC(7, kDebugLoading, "****** Frame request %d, current pos: %ld", frameNum, _framesStream->pos());
+	debugC(7, kDebugLoading, "****** Frame request %d, current pos: %ld, current frame number: %d", frameNum, _framesStream->pos(), _curFrameNumber);
 
 	int sourceFrame = _curFrameNumber;
 	int targetFrame = frameNum;




More information about the Scummvm-git-logs mailing list