void video_manager::frame_update(bool from_debugger) { // only render sound and video if we're in the running phase int phase = machine().phase(); bool skipped_it = m_skipping_this_frame; if (phase == MACHINE_PHASE_RUNNING && (!machine().paused() || machine().options().update_in_pause())) { bool anything_changed = finish_screen_updates(); // if none of the screens changed and we haven't skipped too many frames in a row, // mark this frame as skipped to prevent throttling; this helps for games that // don't update their screen at the monitor refresh rate if (!anything_changed && !m_auto_frameskip && m_frameskip_level == 0 && m_empty_skip_count++ < 3) skipped_it = true; else m_empty_skip_count = 0; } // draw the user interface emulator_info::draw_user_interface(machine()); // if we're throttling, synchronize before rendering attotime current_time = machine().time(); if (!from_debugger && !skipped_it && effective_throttle()) update_throttle(current_time); // ask the OSD to update g_profiler.start(PROFILER_BLIT); machine().osd().update(!from_debugger && skipped_it); g_profiler.stop(); emulator_info::periodic_check(); // perform tasks for this frame if (!from_debugger) machine().call_notifiers(MACHINE_NOTIFY_FRAME); // update frameskipping if (!from_debugger) update_frameskip(); // update speed computations if (!from_debugger && !skipped_it) recompute_speed(current_time); // call the end-of-frame callback if (phase == MACHINE_PHASE_RUNNING) { // reset partial updates if we're paused or if the debugger is active screen_device *const screen = machine().first_screen(); bool const debugger_enabled = machine().debug_flags & DEBUG_FLAG_ENABLED; bool const within_instruction_hook = debugger_enabled && machine().debugger().within_instruction_hook(); if (screen && (machine().paused() || from_debugger || within_instruction_hook)) screen->reset_partial_updates(); } }
void video_manager::frame_update(bool debug) { // only render sound and video if we're in the running phase int phase = machine().phase(); bool skipped_it = m_skipping_this_frame; if (phase == MACHINE_PHASE_RUNNING && (!machine().paused() || machine().options().update_in_pause())) { bool anything_changed = finish_screen_updates(); // if none of the screens changed and we haven't skipped too many frames in a row, // mark this frame as skipped to prevent throttling; this helps for games that // don't update their screen at the monitor refresh rate if (!anything_changed && !m_auto_frameskip && m_frameskip_level == 0 && m_empty_skip_count++ < 3) skipped_it = true; else m_empty_skip_count = 0; } // draw the user interface ui_update_and_render(machine(), &machine().render().ui_container()); // update the internal render debugger debugint_update_during_game(machine()); // if we're throttling, synchronize before rendering attotime current_time = machine().time(); if (!debug && !skipped_it && effective_throttle()) update_throttle(current_time); // ask the OSD to update g_profiler.start(PROFILER_BLIT); machine().osd().update(!debug && skipped_it); g_profiler.stop(); // perform tasks for this frame if (!debug) machine().call_notifiers(MACHINE_NOTIFY_FRAME); // update frameskipping if (!debug) update_frameskip(); // update speed computations if (!debug && !skipped_it) recompute_speed(current_time); // call the end-of-frame callback if (phase == MACHINE_PHASE_RUNNING) { // reset partial updates if we're paused or if the debugger is active if (machine().primary_screen != NULL && (machine().paused() || debug || debugger_within_instruction_hook(machine()))) machine().primary_screen->reset_partial_updates(); } }