[Scummvm-git-logs] scummvm master -> b5fa1e3efd074febe97aafd8b2e5513543e003aa
athrxx
noreply at scummvm.org
Wed Jan 3 19:27:03 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:
b5fa1e3efd KYRA: (EOB) - improve spell anim performance
Commit: b5fa1e3efd074febe97aafd8b2e5513543e003aa
https://github.com/scummvm/scummvm/commit/b5fa1e3efd074febe97aafd8b2e5513543e003aa
Author: athrxx (athrxx at scummvm.org)
Date: 2024-01-03T20:26:32+01:00
Commit Message:
KYRA: (EOB) - improve spell anim performance
(for fireball, ice storm, lightning bolt, cone of cold, etc)
The current code seems to misbehave on platforms with
slow graphics updates (whether related to our backend,
to SDL or the actual graphics drivers or hardware). This
patch allows frame drops if necessary.
Changed paths:
engines/kyra/graphics/screen_eob.cpp
diff --git a/engines/kyra/graphics/screen_eob.cpp b/engines/kyra/graphics/screen_eob.cpp
index 6978ce8c339..502620aba70 100644
--- a/engines/kyra/graphics/screen_eob.cpp
+++ b/engines/kyra/graphics/screen_eob.cpp
@@ -39,7 +39,7 @@
#include "graphics/sjis.h"
#include "graphics/fonts/dosfont.h"
-#define EXPLOSION_ANIM_DURATION 750
+#define EXPLOSION_ANIM_DURATION 500
#define VORTEX_ANIM_DURATION 750
namespace Kyra {
@@ -1293,7 +1293,7 @@ void Screen_EoB::drawExplosion(int scale, int radius, int numElements, int stepS
ptr8[i] = scale << 8;
}
- uint32 playSpeedDelay = ((EXPLOSION_ANIM_DURATION << 15) / numElements) >> 7;
+ uint32 playSpeedDelay = EXPLOSION_ANIM_DURATION << 3;
uint32 frameDelay = (1000 << 8) / 60;
uint32 playSpeedTimer = 0;
uint32 frameTimer = frameDelay;
@@ -1313,12 +1313,16 @@ void Screen_EoB::drawExplosion(int scale, int radius, int numElements, int stepS
setPagePixel(0, px, py, ptr6[i]);
}
- if (_system->getMillis() >= start + (frameTimer >> 8)) {
+ playSpeedTimer += playSpeedDelay;
+ uint32 ct = _system->getMillis();
+ if (ct >= (start + (frameTimer >> 8))) {
updateScreen();
+ uint32 diff = (_system->getMillis() - ct) << 8;
+ if ((int32)diff > 0 && diff > frameDelay)
+ start += ((diff - frameDelay) >> 8);
frameTimer += frameDelay;
}
- playSpeedTimer += playSpeedDelay;
- if (_system->getMillis() < start + (playSpeedTimer >> 15))
+ if (_system->getMillis() < (start + (playSpeedTimer >> 15)))
_vm->delayUntil(start + (playSpeedTimer >> 15));
}
}
@@ -1361,12 +1365,16 @@ void Screen_EoB::drawExplosion(int scale, int radius, int numElements, int stepS
ptr7[i] = 0;
}
- if (_system->getMillis() >= start + (frameTimer >> 8)) {
+ playSpeedTimer += playSpeedDelay;
+ uint32 ct = _system->getMillis();
+ if (ct >= (start + (frameTimer >> 8))) {
updateScreen();
+ uint32 diff = (_system->getMillis() - ct) << 8;
+ if ((int32)diff > 0 && diff > frameDelay)
+ start += ((diff - frameDelay) >> 8);
frameTimer += frameDelay;
}
- playSpeedTimer += playSpeedDelay;
- if (_system->getMillis() < start + (playSpeedTimer >> 15))
+ if (_system->getMillis() < (start + (playSpeedTimer >> 15)))
_vm->delayUntil(start + (playSpeedTimer >> 15));
}
}
@@ -1395,7 +1403,7 @@ void Screen_EoB::drawVortex(int numElements, int radius, int stepSize, int, int
int cy = 48;
radius <<= 6;
- uint32 playSpeedDelay = ((VORTEX_ANIM_DURATION << 16) / numElements) >> 8;
+ uint32 playSpeedDelay = (VORTEX_ANIM_DURATION << 8) / numElements;
uint32 frameDelay = (1000 << 8) / 60;
uint32 playSpeedTimer = 0;
uint32 frameTimer = frameDelay;
@@ -1461,12 +1469,16 @@ void Screen_EoB::drawVortex(int numElements, int radius, int stepSize, int, int
else
setPagePixel(0, px, py, pixBackup[ii]);
- if (_system->getMillis() >= start + (frameTimer >> 8)) {
+ playSpeedTimer += playSpeedDelay;
+ uint32 ct = _system->getMillis();
+ if (ct >= (start + (frameTimer >> 8))) {
updateScreen();
+ uint32 diff = (_system->getMillis() - ct) << 8;
+ if ((int32)diff > 0 && diff > frameDelay)
+ start += ((diff - frameDelay) >> 8);
frameTimer += frameDelay;
}
- playSpeedTimer += playSpeedDelay;
- if (_system->getMillis() < start + (playSpeedTimer >> 16))
+ if (_system->getMillis() < (start + (playSpeedTimer >> 16)))
_vm->delayUntil(start + (playSpeedTimer >> 16));
}
}
@@ -1512,12 +1524,16 @@ void Screen_EoB::drawVortex(int numElements, int radius, int stepSize, int, int
colTableStep[ii] = 0;
}
- if (_system->getMillis() >= start + (frameTimer >> 8)) {
+ playSpeedTimer += playSpeedDelay;
+ uint32 ct = _system->getMillis();
+ if (ct >= (start + (frameTimer >> 8))) {
updateScreen();
+ uint32 diff = (_system->getMillis() - ct) << 8;
+ if ((int32)diff > 0 && diff > frameDelay)
+ start += ((diff - frameDelay) >> 8);
frameTimer += frameDelay;
}
- playSpeedTimer += playSpeedDelay;
- if (_system->getMillis() < start + (playSpeedTimer >> 16))
+ if (_system->getMillis() < (start + (playSpeedTimer >> 16)))
_vm->delayUntil(start + (playSpeedTimer >> 16));
}
d++;
More information about the Scummvm-git-logs
mailing list