Skip to content

Commit 86075b6

Browse files
committed
rg_system: Added app->frameTime to get expected frame time
retro-go now always maintains the expected time a frame should take (time between ticks). I've added `rg_system_set_tick_rate` to replace `app->tickrate = N` to ensure frameTime is recalculated when tickrate changes.
1 parent 0e294ec commit 86075b6

File tree

12 files changed

+38
-29
lines changed

12 files changed

+38
-29
lines changed

components/retro-go/rg_system.c

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,7 @@ rg_app_t *rg_system_init(int sampleRate, const rg_handlers_t *handlers, const rg
367367
.speed = 1.f,
368368
.sampleRate = sampleRate,
369369
.tickRate = 60,
370+
.frameTime = 1000000 / 60,
370371
.frameskip = 1,
371372
.overclock = 0,
372373
.tickTimeout = 3000000,
@@ -772,6 +773,17 @@ rg_stats_t rg_system_get_counters(void)
772773
return statistics;
773774
}
774775

776+
void rg_system_set_tick_rate(int tickRate)
777+
{
778+
app.tickRate = tickRate;
779+
app.frameTime = 1000000 / (app.tickRate * app.speed);
780+
}
781+
782+
int rg_system_get_tick_rate(void)
783+
{
784+
return app.tickRate;
785+
}
786+
775787
void rg_system_tick(int busyTime)
776788
{
777789
statistics.lastTick = rg_system_timer();
@@ -1372,8 +1384,8 @@ rg_emu_states_t *rg_emu_get_states(const char *romPath, size_t slots)
13721384

13731385
bool rg_emu_reset(bool hard)
13741386
{
1375-
app.frameskip = 0;
1376-
app.speed = 1.f;
1387+
app.frameskip = 1;
1388+
rg_emu_set_speed(1.f);
13771389
if (app.handlers.reset)
13781390
return app.handlers.reset(hard);
13791391
return false;
@@ -1383,6 +1395,7 @@ void rg_emu_set_speed(float speed)
13831395
{
13841396
app.speed = RG_MIN(2.5f, RG_MAX(0.5f, speed));
13851397
app.frameskip = RG_MAX(app.frameskip, (app.speed > 1.0f) ? 2 : 0);
1398+
app.frameTime = 1000000.f / (app.tickRate * app.speed);
13861399
rg_audio_set_sample_rate(app.sampleRate * app.speed);
13871400
rg_system_event(RG_EVENT_SPEEDUP, NULL);
13881401
}

components/retro-go/rg_system.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ typedef struct
177177
float speed;
178178
int sampleRate;
179179
int tickRate;
180+
int frameTime;
180181
int frameskip;
181182
int overclock;
182183
int tickTimeout;
@@ -227,6 +228,8 @@ void rg_system_set_indicator(rg_indicator_t indicator, bool on);
227228
bool rg_system_get_indicator(rg_indicator_t indicator);
228229
void rg_system_set_indicator_mask(rg_indicator_t indicator, bool on);
229230
bool rg_system_get_indicator_mask(rg_indicator_t indicator);
231+
void rg_system_set_tick_rate(int tickRate);
232+
int rg_system_get_tick_rate(void);
230233
void rg_system_set_overclock(int level);
231234
int rg_system_get_overclock(void);
232235
void rg_system_set_log_level(rg_log_level_t level);

fmsx/main/main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,7 @@ void app_main(void)
438438

439439
app = rg_system_init(AUDIO_SAMPLE_RATE, &handlers, options);
440440
// This is probably not right, but the emulator outputs 440 samples per frame??
441-
app->tickRate = 55;
441+
rg_system_set_tick_rate(55);
442442

443443
updates[0] = rg_surface_create(WIDTH, HEIGHT, RG_PIXEL_565_BE, MEM_FAST);
444444
updates[1] = rg_surface_create(WIDTH, HEIGHT, RG_PIXEL_565_BE, MEM_FAST);

gwenesis/main/main.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -253,8 +253,8 @@ void app_main(void)
253253
rg_emu_load_state(app->saveSlot);
254254
}
255255

256-
app->tickRate = 60;
257-
app->frameskip = 3;
256+
rg_system_set_tick_rate(60);
257+
rg_system_set_frame_skip(3, 15, true);
258258

259259
extern unsigned char gwenesis_vdp_regs[0x20];
260260
extern unsigned int gwenesis_vdp_status;
@@ -402,11 +402,10 @@ void app_main(void)
402402

403403
if (skipFrames == 0)
404404
{
405-
int frameTime = 1000000 / (app->tickRate * app->speed);
406405
int elapsed = rg_system_timer() - startTime;
407406
if (app->frameskip > 0)
408407
skipFrames = app->frameskip;
409-
else if (elapsed > frameTime + 1500) // Allow some jitter
408+
else if (elapsed > app->frameTime + 1500) // Allow some jitter
410409
skipFrames = 1; // (elapsed / frameTime)
411410
else if (drawFrame && slowFrame)
412411
skipFrames = 1;

prboom-go/main/main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -539,7 +539,7 @@ void app_main()
539539
};
540540

541541
app = rg_system_init(AUDIO_SAMPLE_RATE, &handlers, options);
542-
app->tickRate = TICRATE;
542+
rg_system_set_tick_rate(TICRATE);
543543

544544
const rg_display_t *display = rg_display_get_info();
545545
SCREENWIDTH = RG_MIN(display->screen.width, MAX_SCREENWIDTH);

retro-core/main/main_gbc.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -373,11 +373,10 @@ void gbc_main(void)
373373

374374
if (skipFrames == 0)
375375
{
376-
int frameTime = 1000000 / (app->tickRate * app->speed);
377376
int elapsed = rg_system_timer() - startTime;
378377
if (app->frameskip > 0)
379378
skipFrames = app->frameskip;
380-
else if (elapsed > frameTime + 1500) // Allow some jitter
379+
else if (elapsed > app->frameTime + 1500) // Allow some jitter
381380
skipFrames = 1; // (elapsed / frameTime)
382381
else if (drawFrame && slowFrame)
383382
skipFrames = 1;

retro-core/main/main_gw.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,6 @@ void gw_main(void)
139139
};
140140

141141
app = rg_system_reinit(AUDIO_SAMPLE_RATE, &handlers, options);
142-
app->tickRate = GW_REFRESH_RATE;
143142

144143
updates[0] = rg_surface_create(GW_SCREEN_WIDTH, GW_SCREEN_HEIGHT, RG_PIXEL_565_LE, MEM_FAST);
145144
currentUpdate = updates[0];
@@ -228,6 +227,8 @@ void gw_main(void)
228227
/*** Main emulator loop */
229228
printf("Main emulator loop start\n");
230229

230+
rg_system_set_tick_rate(GW_REFRESH_RATE);
231+
231232
while (true)
232233
{
233234
/* refresh internal G&W timer on emulated CPU state transition */

retro-core/main/main_lynx.cpp

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -201,9 +201,6 @@ extern "C" void lynx_main(void)
201201
updates[1] = rg_surface_create(HANDY_SCREEN_WIDTH, HANDY_SCREEN_WIDTH, RG_PIXEL_565_BE, MEM_FAST);
202202
currentUpdate = updates[0];
203203

204-
// The Lynx has a variable framerate but 60 is typical
205-
app->tickRate = 60;
206-
207204
// Init emulator
208205
lynx = new_lynx();
209206

@@ -223,7 +220,6 @@ extern "C" void lynx_main(void)
223220

224221
set_display_mode();
225222

226-
float sampleTime = 1000000.f / app->sampleRate;
227223
long skipFrames = 0;
228224
bool slowFrame = false;
229225

@@ -238,7 +234,6 @@ extern "C" void lynx_main(void)
238234
rg_gui_game_menu();
239235
else
240236
rg_gui_options_menu();
241-
sampleTime = 1000000.f / (app->sampleRate * app->speed);
242237
}
243238

244239
int64_t startTime = rg_system_timer();
@@ -265,20 +260,20 @@ extern "C" void lynx_main(void)
265260
gPrimaryFrameBuffer = (UBYTE*)currentUpdate->data;
266261
}
267262

268-
app->tickRate = AUDIO_SAMPLE_RATE / (gAudioBufferPointer / 2);
263+
// The Lynx has a variable tick rate, I don't know of a better way to guess than from audio stream
264+
rg_system_set_tick_rate(AUDIO_SAMPLE_RATE / (gAudioBufferPointer / 2));
269265
rg_system_tick(rg_system_timer() - startTime);
270266

271267
rg_audio_submit(audioBuffer, gAudioBufferPointer >> 1);
272268

273269
// See if we need to skip a frame to keep up
274270
if (skipFrames == 0)
275271
{
276-
int frameTime = ((gAudioBufferPointer / 2) * sampleTime);
277272
int elapsed = rg_system_timer() - startTime;
278273
if (app->frameskip > 0)
279274
skipFrames = app->frameskip;
280275
// The Lynx uses a variable framerate so we use the count of generated audio samples as reference instead
281-
else if (elapsed > frameTime + 1500)
276+
else if (elapsed > app->frameTime + 1500)
282277
skipFrames = 1; // (elapsed / frameTime)
283278
else if (drawFrame && slowFrame)
284279
skipFrames = 1;

retro-core/main/main_nes.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,6 @@ void nes_main(void)
233233
else if (ret < 0)
234234
RG_PANIC("Unsupported ROM.");
235235

236-
app->tickRate = nes->refresh_rate;
237236
nes->blit_func = blit_screen;
238237

239238
nsfPlayer = nes->cart->type == ROM_TYPE_NSF;
@@ -252,6 +251,8 @@ void nes_main(void)
252251
rg_emu_load_state(app->saveSlot);
253252
}
254253

254+
rg_system_set_tick_rate(nes->refresh_rate);
255+
255256
int skipFrames = 0;
256257

257258
while (true)

retro-core/main/main_pce.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ void osd_vsync(void)
7474
}
7575

7676
int64_t curtime = rg_system_timer();
77-
int frameTime = 1000000 / (app->tickRate * app->speed);
77+
int frameTime = app->frameTime;
7878
int sleep = frameTime - (curtime - lasttime);
7979

8080
if (sleep > frameTime)
@@ -238,7 +238,7 @@ void pce_main(void)
238238
rg_emu_load_state(app->saveSlot);
239239
}
240240

241-
app->tickRate = 60;
241+
rg_system_set_tick_rate(60);
242242
app->frameskip = 1;
243243

244244
emulationPaused = false;

0 commit comments

Comments
 (0)