diff --git a/engines/sword25/gfx/graphicengine.cpp b/engines/sword25/gfx/graphicengine.cpp index ea0c8c82c57..9f3ce665cd5 100644 --- a/engines/sword25/gfx/graphicengine.cpp +++ b/engines/sword25/gfx/graphicengine.cpp @@ -83,7 +83,7 @@ GraphicEngine::GraphicEngine(Kernel *pKernel) : m_Height(0), m_BitDepth(0), m_Windowed(0), - m_LastTimeStamp((uint64) - 1), // max. BS_INT64 um beim ersten Aufruf von _UpdateLastFrameDuration() einen Reset zu erzwingen + m_LastTimeStamp((uint) -1), // max. BS_INT64 um beim ersten Aufruf von _UpdateLastFrameDuration() einen Reset zu erzwingen m_LastFrameDuration(0), m_TimerActive(true), m_FrameTimeSampleSlot(0), @@ -378,23 +378,25 @@ void GraphicEngine::DrawDebugLine(const Vertex &Start, const Vertex &End, uint C } void GraphicEngine::UpdateLastFrameDuration() { - // Aktuelle Zeit holen - uint64_t CurrentTime = Kernel::GetInstance()->GetMicroTicks(); + // Record current time + const uint currentTime = Kernel::GetInstance()->GetMilliTicks(); - // Verstrichene Zeit seit letztem Frame berechnen und zu große Zeitsprünge ( > 250 msek.) unterbinden - // (kann vorkommen bei geladenen Spielständen, während des Debuggings oder Hardwareungenauigkeiten) - m_FrameTimeSamples[m_FrameTimeSampleSlot] = static_cast(CurrentTime - m_LastTimeStamp); - if (m_FrameTimeSamples[m_FrameTimeSampleSlot] > 250000) m_FrameTimeSamples[m_FrameTimeSampleSlot] = 250000; + // Compute the elapsed time since the last frame and prevent too big ( > 250 msecs) time jumps. + // These can occur when loading save states, during debugging or due to hardware inaccuracies. + m_FrameTimeSamples[m_FrameTimeSampleSlot] = static_cast(currentTime - m_LastTimeStamp); + if (m_FrameTimeSamples[m_FrameTimeSampleSlot] > 250000) + m_FrameTimeSamples[m_FrameTimeSampleSlot] = 250000; m_FrameTimeSampleSlot = (m_FrameTimeSampleSlot + 1) % FRAMETIME_SAMPLE_COUNT; - // Die Framezeit wird über mehrere Frames gemittelt um Ausreisser zu eliminieren + // Compute the average frame duration over multiple frames to eliminate outliers. Common::Array::const_iterator it = m_FrameTimeSamples.begin(); - uint Sum = *it; - for (it++; it != m_FrameTimeSamples.end(); it++) Sum += *it; - m_LastFrameDuration = Sum / FRAMETIME_SAMPLE_COUNT; + uint sum = *it; + for (it++; it != m_FrameTimeSamples.end(); it++) + sum += *it; + m_LastFrameDuration = sum * 1000 / FRAMETIME_SAMPLE_COUNT; - // _LastTimeStamp auf die Zeit des aktuellen Frames setzen - m_LastTimeStamp = CurrentTime; + // Update m_LastTimeStamp with the current frame's timestamp + m_LastTimeStamp = currentTime; } namespace { diff --git a/engines/sword25/gfx/graphicengine.h b/engines/sword25/gfx/graphicengine.h index 019f5eec4cd..ecbfa377c81 100644 --- a/engines/sword25/gfx/graphicengine.h +++ b/engines/sword25/gfx/graphicengine.h @@ -189,17 +189,19 @@ public: /** * Specifies the time (in microseconds) since the last frame has passed */ - int GetLastFrameDurationMicro() { - if (m_TimerActive) return m_LastFrameDuration; - else return 0; + int GetLastFrameDurationMicro() const { + if (!m_TimerActive) + return 0; + return m_LastFrameDuration; } /** * Specifies the time (in microseconds) the previous frame took */ - float GetLastFrameDuration() { - if (m_TimerActive) return static_cast(m_LastFrameDuration) / 1000000.0f; - else return 0; + float GetLastFrameDuration() const { + if (!m_TimerActive) + return 0; + return static_cast(m_LastFrameDuration) / 1000000.0f; } void StopMainTimer() { @@ -208,7 +210,7 @@ public: void ResumeMainTimer() { m_TimerActive = true; } - float GetSecondaryFrameDuration() { + float GetSecondaryFrameDuration() const { return static_cast(m_LastFrameDuration) / 1000000.0f; } @@ -217,14 +219,14 @@ public: /** * Returns the width of the output buffer in pixels */ - int GetDisplayWidth() { + int GetDisplayWidth() const { return m_Width; } /** * Returns the height of the output buffer in pixels */ - int GetDisplayHeight() { + int GetDisplayHeight() const { return m_Height; } @@ -365,7 +367,7 @@ private: // LastFrameDuration Variables // --------------------------- - uint64 m_LastTimeStamp; + uint m_LastTimeStamp; uint m_LastFrameDuration; bool m_TimerActive; Common::Array m_FrameTimeSamples; diff --git a/engines/sword25/kernel/bs_stdint.h b/engines/sword25/kernel/bs_stdint.h index c1970bff3e8..360ac594366 100644 --- a/engines/sword25/kernel/bs_stdint.h +++ b/engines/sword25/kernel/bs_stdint.h @@ -39,13 +39,6 @@ #include "common/scummsys.h" -typedef uint8 uint8_t; -typedef uint16 uint16_t; -typedef uint32 uint32_t; -typedef int8 int8_t; -typedef int16 int16_t; -typedef int32 int32_t; - typedef unsigned long long uint64_t; typedef signed long long int64_t; typedef unsigned long long uint64; diff --git a/engines/sword25/kernel/kernel.cpp b/engines/sword25/kernel/kernel.cpp index 3e7e7f125ff..cccfc6ea530 100644 --- a/engines/sword25/kernel/kernel.cpp +++ b/engines/sword25/kernel/kernel.cpp @@ -362,14 +362,6 @@ uint Kernel::GetMilliTicks() { return g_system->getMillis(); } -/** - * Returns the elapsed time since the system start in microseconds. - * This method should be used only if GetMilliTick() for the desired application is inaccurate. - */ -uint64 Kernel::GetMicroTicks() { - return g_system->getMillis() * 1000; -} - // Other methods // ----------------- diff --git a/engines/sword25/kernel/kernel.h b/engines/sword25/kernel/kernel.h index 55a64c783f2..6bc6f3de03b 100644 --- a/engines/sword25/kernel/kernel.h +++ b/engines/sword25/kernel/kernel.h @@ -159,12 +159,6 @@ public: */ uint GetMilliTicks(); - /** - * Returns the elapsed time since the system start in microseconds. - * This method should be used only if GetMilliTick() for the desired application is inaccurate. - */ - uint64 GetMicroTicks(); - /** * Specifies whether the kernel was successfully initialised */ diff --git a/engines/sword25/kernel/kernel_script.cpp b/engines/sword25/kernel/kernel_script.cpp index 1b87dfdc6ed..2f41660fb89 100644 --- a/engines/sword25/kernel/kernel_script.cpp +++ b/engines/sword25/kernel/kernel_script.cpp @@ -132,7 +132,7 @@ static int GetTimer(lua_State *L) { Kernel *pKernel = Kernel::GetInstance(); BS_ASSERT(pKernel); - lua_pushnumber(L, static_cast(pKernel->GetMicroTicks()) / 1000000.0); + lua_pushnumber(L, static_cast(pKernel->GetMilliTicks()) / 1000.0); return 1; }