summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authordaco65 <daco65@gmail.com>2009-08-12 16:42:51 +0000
committerdaco65 <daco65@gmail.com>2009-08-12 16:42:51 +0000
commitea561430ff79ac1b3b4fb0efe8ed8afbd39058ef (patch)
tree29a9bb8644bce90cdf1ffe1c5ea39ffb5c23fbed /Source/Core
parent122d0444044bf8455ecc395ded1217795e7cfc7b (diff)
auto frameskip by Iulius. the automatic should make it so that dolphin doesn't skip more then needed (example: you have frameskip 9 but only need 4.2, auto will make it skip on 4.2)
framelimit should be on git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@3972 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/Src/Core.cpp47
-rw-r--r--Source/Core/Core/Src/Core.h2
-rw-r--r--Source/Core/Core/Src/OnFrame.cpp11
3 files changed, 50 insertions, 10 deletions
diff --git a/Source/Core/Core/Src/Core.cpp b/Source/Core/Core/Src/Core.cpp
index 72831b4e0a..13d17548a4 100644
--- a/Source/Core/Core/Src/Core.cpp
+++ b/Source/Core/Core/Src/Core.cpp
@@ -67,6 +67,8 @@ namespace Core
// Declarations and definitions
+Common::Timer Timer;
+u32 frames = 0;
// Function forwarding
@@ -587,6 +589,30 @@ void Callback_VideoLog(const TCHAR *_szMessage, int _bDoBreak)
INFO_LOG(VIDEO, _szMessage);
}
+// reports if a frame should be skipped or not
+// depending on the framelimit set
+bool report_slow(int skipped)
+{
+ u32 targetfps = SConfig::GetInstance().m_Framelimit * 5;
+ double wait_frametime;
+
+ if (targetfps < 5)
+ wait_frametime = (1000.0 / VideoInterface::TargetRefreshRate);
+ else
+ wait_frametime = (1000.0 / targetfps);
+
+ bool fps_slow;
+
+ if (Timer.GetTimeDifference() < wait_frametime * (frames + skipped - 1))
+ fps_slow=false;
+ else
+ fps_slow=true;
+
+ if (targetfps == 5)
+ fps_slow=true;
+
+ return fps_slow;
+}
// Callback_VideoCopiedToXFB
// WARNING - THIS IS EXECUTED FROM VIDEO THREAD
@@ -599,15 +625,18 @@ void Callback_VideoCopiedToXFB(bool video_update)
SCoreStartupParameter& _CoreParameter = SConfig::GetInstance().m_LocalCoreStartupParameter;
//count FPS and VPS
- static Common::Timer Timer;
- static u32 frames = 0;
static u32 videoupd = 0;
+ static u32 no_framelimit = 0;
+
if (video_update)
videoupd++;
else
frames++;
+ if (no_framelimit>0)
+ no_framelimit--;
+
// Custom frame limiter
// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ
u32 targetfps = SConfig::GetInstance().m_Framelimit * 5;
@@ -616,18 +645,28 @@ void Callback_VideoCopiedToXFB(bool video_update)
{
double wait_frametime = (1000.0 / targetfps);
+ if (Timer.GetTimeDifference() >= wait_frametime * frames)
+ no_framelimit=Timer.GetTimeDifference();
+
while (Timer.GetTimeDifference() < wait_frametime * frames)
- Common::SleepCurrentThread(1);
+ {
+ if (no_framelimit==0)
+ Common::SleepCurrentThread(1);
+ }
}
else if (targetfps < 5)
{
double wait_frametime = (1000.0 / VideoInterface::TargetRefreshRate);
+ if (Timer.GetTimeDifference() >= wait_frametime * frames)
+ no_framelimit=Timer.GetTimeDifference();
+
while (Timer.GetTimeDifference() < wait_frametime * videoupd)
{
// TODO : This is wrong, the sleep shouldn't be there but rather in cputhread
// as it's not based on the fps but on the refresh rate...
- Common::SleepCurrentThread(1);
+ if (no_framelimit==0)
+ Common::SleepCurrentThread(1);
}
}
diff --git a/Source/Core/Core/Src/Core.h b/Source/Core/Core/Src/Core.h
index 0bd40ef2c3..49cbaa7ec0 100644
--- a/Source/Core/Core/Src/Core.h
+++ b/Source/Core/Core/Src/Core.h
@@ -72,6 +72,8 @@ namespace Core
void SetBlockStart(u32 addr);
void StopTrace();
+ bool report_slow(int skipped);
+
// -----------------------------------------
#ifdef RERECORDING
// -----------------
diff --git a/Source/Core/Core/Src/OnFrame.cpp b/Source/Core/Core/Src/OnFrame.cpp
index 36c43123e8..b3515bf5ce 100644
--- a/Source/Core/Core/Src/OnFrame.cpp
+++ b/Source/Core/Core/Src/OnFrame.cpp
@@ -33,16 +33,15 @@ bool g_bFirstKey = true;
int g_framesToSkip = 0, g_frameSkipCounter = 0;
void FrameUpdate() {
+
+
if (g_bFrameStep)
Core::SetState(Core::CORE_PAUSE);
+ FrameSkipping();
+
if (g_bAutoFire)
g_bFirstKey = !g_bFirstKey;
-
- if (g_framesToSkip)
- FrameSkipping();
- else
- CPluginManager::GetInstance().GetVideo()->Video_SetRendering(true);
}
@@ -123,7 +122,7 @@ void FrameSkipping()
cs_frameSkip.Enter();
g_frameSkipCounter++;
- if (g_frameSkipCounter > g_framesToSkip)
+ if (g_frameSkipCounter > g_framesToSkip || Core::report_slow(g_frameSkipCounter) == false)
g_frameSkipCounter = 0;
CPluginManager::GetInstance().GetVideo()->Video_SetRendering(!g_frameSkipCounter);