> > How do 30hz games such as Rampage work in MAME, then? They seem to run at the > correct > > speed on a 60hz LCD. It's effectively running at double its native refresh rate. > > Because it runs at 30 Hz and the monitor draws each frame twice since we don't swap > the back buffers until each 30 Hz update. This is the same as how native 30 Hz PC > games run. > > > Why can 30hz games run at double their refresh rate in baseline MAME with a > standard > > 60hz monitor, yet Street Fighter can't run at 119.26hz on displays that can run at > > that refresh rate? The GroovyMAME black frame insertion solution would work if the > > games just ran at double their native refresh rate instead of being forced to 120hz > > globally (for 60hz games, it works fine). > > Sounds like GroovyMAME also includes the popular "force all games to 60 Hz" patch, so > 60 and near-60 games are forced to 60.0 and then the Gsync support doubles that rate. > Obviously you don't want or need the 60 Hz force patch for Gsync since the entire > point is that you *can* do fractional refresh rates.
Right, but the part that confuses me is that just drawing each frame twice doesn't seem to work, either. If I add the black frames using the GroovyMAME technique but don't force the games to run at 120hz, it doubles the refresh rate, but there's hitching and audio breakup.
This is what GroovyMAME's doing, by the way. It's modifying video_manager::frame_update in video.c like so:
if (machine().options().black_frame_insertion() && machine().options().sync_refresh()) { render_container *container = &machine().render().ui_container(); container->add_rect(0, 0, 1, 1, ARGB_BLACK, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); machine().osd().update(!debug && skipped_it); }
// if we're throttling, delay after rendering attotime current_time = machine().time(); if (!debug && !skipped_it && effective_throttle()) update_throttle(current_time);
Making this modification without forcing syncrefresh doesn't seem to work (you get audio breakup and stuttering).
|