From f2adea7bb2250876df3d1b6e076a6b5380c6b13e Mon Sep 17 00:00:00 2001 From: Nebuleon Fumika Date: Tue, 5 Feb 2013 19:39:09 -0500 Subject: Force both manual and automatic frameskipping to be at or above 2. Resets the default value for all games which previously had this value configured. --- source/nds/entry.cpp | 14 +++++++++++--- source/nds/gui.c | 4 ++-- source/nds/gui.h | 22 ++++++++++++++++++++-- source/nds/message.h | 4 ++-- 4 files changed, 35 insertions(+), 9 deletions(-) (limited to 'source/nds') diff --git a/source/nds/entry.cpp b/source/nds/entry.cpp index 18802a0..6cbf3ef 100644 --- a/source/nds/entry.cpp +++ b/source/nds/entry.cpp @@ -390,7 +390,7 @@ void game_set_frameskip() } else { - Settings.SkipFrames = game_config.frameskip_value - 1 /* 1 -> 0 and so on */; + Settings.SkipFrames = game_config.frameskip_value + 1 /* 1 -> 2 and so on */; } } @@ -639,7 +639,6 @@ int sfc_main (int argc, char **argv) static unsigned int sync_last= 0; static unsigned int sync_next = 0; -static unsigned int auto_equivalent_skip = 0; static unsigned int skip_rate= 0; @@ -690,7 +689,16 @@ void S9xSyncSpeed () // If this is negative, we're late by syncdif*42.66 // microseconds. syncdif = sync_next - syncnow; - if (syncdif < 0 && syncdif >= -(frame_time / 2)) + if(skip_rate < 2 /* did not skip 2 frames yet */) + { + // Skip a minimum of 2 frames between rendered frames. + // This prevents the DSTwo-DS link from being too busy + // to return button statuses. + ++skip_rate; + IPPU.RenderThisFrame = FALSE; + sync_next += frame_time; + } + else if (syncdif < 0 && syncdif >= -(frame_time / 2)) { // We're late, but by less than half a frame. Draw it // anyway. If the next frame is too late, it'll be diff --git a/source/nds/gui.c b/source/nds/gui.c index 764ca66..4b5955a 100644 --- a/source/nds/gui.c +++ b/source/nds/gui.c @@ -2826,7 +2826,7 @@ u32 menu(u16 *screen, bool8 FirstInvocation) (char*)&msg[MSG_VIDEO_ASPECT_RATIO_3], (char*)&msg[MSG_VIDEO_ASPECT_RATIO_4]}; - char *frameskip_options[] = { (char*)&msg[MSG_VIDEO_FRAME_SKIPPING_AUTOMATIC], (char*)&msg[MSG_VIDEO_FRAME_SKIPPING_0], (char*)&msg[MSG_VIDEO_FRAME_SKIPPING_1], (char*)&msg[MSG_VIDEO_FRAME_SKIPPING_2], (char*)&msg[MSG_VIDEO_FRAME_SKIPPING_3], (char*)&msg[MSG_VIDEO_FRAME_SKIPPING_4], (char*)&msg[MSG_VIDEO_FRAME_SKIPPING_5], (char*)&msg[MSG_VIDEO_FRAME_SKIPPING_6], (char*)&msg[MSG_VIDEO_FRAME_SKIPPING_7], (char*)&msg[MSG_VIDEO_FRAME_SKIPPING_8], (char*)&msg[MSG_VIDEO_FRAME_SKIPPING_9], (char*)&msg[MSG_VIDEO_FRAME_SKIPPING_10] }; + char *frameskip_options[] = { (char*)&msg[MSG_VIDEO_FRAME_SKIPPING_AUTOMATIC], (char*)&msg[MSG_VIDEO_FRAME_SKIPPING_2], (char*)&msg[MSG_VIDEO_FRAME_SKIPPING_3], (char*)&msg[MSG_VIDEO_FRAME_SKIPPING_4], (char*)&msg[MSG_VIDEO_FRAME_SKIPPING_5], (char*)&msg[MSG_VIDEO_FRAME_SKIPPING_6], (char*)&msg[MSG_VIDEO_FRAME_SKIPPING_7], (char*)&msg[MSG_VIDEO_FRAME_SKIPPING_8], (char*)&msg[MSG_VIDEO_FRAME_SKIPPING_9], (char*)&msg[MSG_VIDEO_FRAME_SKIPPING_10] }; char *fluidity_options[] = { (char*)&msg[MSG_VIDEO_AUDIO_FLUIDITY_PREFER_VIDEO], (char*)&msg[MSG_VIDEO_AUDIO_FLUIDITY_PREFER_AUDIO] }; @@ -2858,7 +2858,7 @@ u32 menu(u16 *screen, bool8 FirstInvocation) &game_config.SoundSync, 2, NULL, ACTION_TYPE, 4), /* 05 */ STRING_SELECTION_OPTION(game_set_frameskip, NULL, &msg[FMT_VIDEO_FRAME_SKIPPING], frameskip_options, - &game_config.frameskip_value, 12 /* auto (0) and 0..10 (1..11) make 12 option values */, NULL, ACTION_TYPE, 5) + &game_config.frameskip_value, 10 /* auto (0) and 2..10 (1..9) make 10 option values */, NULL, ACTION_TYPE, 5) }; MAKE_MENU(graphics, NULL, NULL, NULL, NULL, 0, 0); diff --git a/source/nds/gui.h b/source/nds/gui.h index e8302eb..b390b69 100644 --- a/source/nds/gui.h +++ b/source/nds/gui.h @@ -50,7 +50,24 @@ struct _GAME_CONFIG { u32 clock_speed_number; u32 Reserved0; - u32 frameskip_value; + /* + * PreviouslyUsed_20130205_1 was formerly known as 'frameskip_value'; + * its values were in [0, 10]. 0 was automatic frameskipping and + * [1, 10] were mapped to skip 0 to 9 frames respectively. + * Version 1.29 changes the value range for 'frameskip_value' to + * [0, 8], with 0 as automatic frameskipping and [1, 10] to skip 2 to + * 9 frames. + * Change rationale: Frame skip values under 2 cause too much + * communication between the DSTwo and the DS, therefore the DS cannot + * timely send controller information. + * If this variable were to be used as is, the meaning of the option + * would be changed for values in [1, 8], and values in [9, 10] would + * cause undefined behavior, including crashes. + * THIS VALUE IS NOT GUARANTEED TO BE RESERVED AND SET TO 0. + * DO NOT USE THIS VALUE FOR ANY PURPOSE OTHER THAN EXACTLY THE ONE + * FOR WHICH IT WAS INTENDED. + */ + u32 PreviouslyUsed_20130205_1; u32 graphic; u32 enable_audio; u32 Reserved1; @@ -60,7 +77,8 @@ struct _GAME_CONFIG u32 HotkeyTemporaryFastForward; u32 HotkeyToggleSound; u32 SoundSync; - u32 Reserved2[44]; + u32 frameskip_value; + u32 Reserved2[43]; }; typedef enum diff --git a/source/nds/message.h b/source/nds/message.h index b5bb47b..86389b1 100644 --- a/source/nds/message.h +++ b/source/nds/message.h @@ -70,8 +70,8 @@ enum MSG MSG_VIDEO_ASPECT_RATIO_4, MSG_VIDEO_FRAME_SKIPPING_AUTOMATIC, - MSG_VIDEO_FRAME_SKIPPING_0, - MSG_VIDEO_FRAME_SKIPPING_1, + MSG_VIDEO_FRAME_SKIPPING_0 /* unused */, + MSG_VIDEO_FRAME_SKIPPING_1 /* unused */, MSG_VIDEO_FRAME_SKIPPING_2, MSG_VIDEO_FRAME_SKIPPING_3, MSG_VIDEO_FRAME_SKIPPING_4, -- cgit v1.2.3