diff options
author | Colin Snover | 2016-06-14 17:43:57 -0500 |
---|---|---|
committer | Colin Snover | 2016-06-14 20:58:53 -0500 |
commit | b56266d28dad338243dd0982328fed7f48633e84 (patch) | |
tree | 9f9a9ee95b551fa58785e7fc087cf024e53caf7e | |
parent | 934e1860637186c98d4dd8434a260923748b8936 (diff) | |
download | scummvm-rg350-b56266d28dad338243dd0982328fed7f48633e84.tar.gz scummvm-rg350-b56266d28dad338243dd0982328fed7f48633e84.tar.bz2 scummvm-rg350-b56266d28dad338243dd0982328fed7f48633e84.zip |
SCI32: Fix video performance benchmarking in most SCI32 games
Most SCI32 games draw a "fred" object to the screen when the game
first starts to benchmark video performance. When framerate
throttling is enabled (which fixes many/most timing-related bugs
and reduces system load caused by unnecessary graphics updates),
the game's performance check will think that video card is slow,
causing some "high-performance" game features to be disabled.
To avoid this, we simply disable throttling during benchmarking by
detecting the "fred" object.
-rw-r--r-- | engines/sci/engine/kgraphics32.cpp | 2 | ||||
-rw-r--r-- | engines/sci/graphics/frameout.cpp | 30 | ||||
-rw-r--r-- | engines/sci/graphics/frameout.h | 16 |
3 files changed, 46 insertions, 2 deletions
diff --git a/engines/sci/engine/kgraphics32.cpp b/engines/sci/engine/kgraphics32.cpp index 6c51ec4284..b140062ca0 100644 --- a/engines/sci/engine/kgraphics32.cpp +++ b/engines/sci/engine/kgraphics32.cpp @@ -133,8 +133,6 @@ reg_t kGetHighPlanePri(EngineState *s, int argc, reg_t *argv) { reg_t kFrameOut(EngineState *s, int argc, reg_t *argv) { bool showBits = argc > 0 ? argv[0].toUint16() : true; g_sci->_gfxFrameout->kernelFrameOut(showBits); - s->speedThrottler(16); - s->_throttleTrigger = true; return s->r_acc; } diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp index 009ae2818e..2d44e38390 100644 --- a/engines/sci/graphics/frameout.cpp +++ b/engines/sci/graphics/frameout.cpp @@ -77,6 +77,8 @@ GfxFrameout::GfxFrameout(SegManager *segMan, ResourceManager *resMan, GfxCoordAd _screen(screen), _segMan(segMan), _paint32(paint32), + _benchmarkingFinished(false), + _throttleFrameOut(true), _showStyles(nullptr), // TODO: Stop using _gfxScreen _currentBuffer(screen->getDisplayWidth(), screen->getDisplayHeight(), nullptr), @@ -258,6 +260,17 @@ void GfxFrameout::syncWithScripts(bool addElements) { #pragma mark Screen items void GfxFrameout::kernelAddScreenItem(const reg_t object) { + // The "fred" object is used to test graphics performance; + // it is impacted by framerate throttling, so disable the + // throttling when this item is on the screen for the + // performance check to pass. + if (!_benchmarkingFinished && ( + (int16)readSelectorValue(_segMan, object, SELECTOR(view)) == -556 || + Common::String(_segMan->getObjectName(object)) == "fred" + )) { + _throttleFrameOut = false; + } + const reg_t planeObject = readSelector(_segMan, object, SELECTOR(plane)); _segMan->getObject(object)->setInfoSelectorFlag(kInfoFlagViewInserted); @@ -297,6 +310,18 @@ void GfxFrameout::kernelUpdateScreenItem(const reg_t object) { } void GfxFrameout::kernelDeleteScreenItem(const reg_t object) { + // The "fred" object is used to test graphics performance; + // it is impacted by framerate throttling, so disable the + // throttling when this item is on the screen for the + // performance check to pass. + if (!_benchmarkingFinished && ( + (int16)readSelectorValue(_segMan, object, SELECTOR(view)) == -556 || + Common::String(_segMan->getObjectName(object)) == "fred" + )) { + _benchmarkingFinished = true; + _throttleFrameOut = true; + } + _segMan->getObject(object)->clearInfoSelectorFlag(kInfoFlagViewInserted); const reg_t planeObject = readSelector(_segMan, object, SELECTOR(plane)); @@ -1395,6 +1420,11 @@ void GfxFrameout::kernelFrameOut(const bool shouldShowBits) { frameOut(shouldShowBits); } + + if (_throttleFrameOut) { + g_sci->getEngineState()->speedThrottler(16); + g_sci->getEngineState()->_throttleTrigger = true; + } } #pragma mark - diff --git a/engines/sci/graphics/frameout.h b/engines/sci/graphics/frameout.h index 8ed95a00de..0f06ee1c85 100644 --- a/engines/sci/graphics/frameout.h +++ b/engines/sci/graphics/frameout.h @@ -179,6 +179,22 @@ public: void run(); #pragma mark - +#pragma mark Benchmarking +private: + /** + * Optimization to avoid the more expensive object name + * comparision on every call to kAddScreenItem and + * kRemoveScreenItem. + */ + bool _benchmarkingFinished; + + /** + * Whether or not calls to kFrameOut should be framerate + * limited to ~60fps. + */ + bool _throttleFrameOut; + +#pragma mark - #pragma mark Screen items private: void deleteScreenItem(ScreenItem *screenItem, const reg_t plane); |