menu_view: fix frame dropping after sleep

When idle, menu_view de-schedules timer events to save processing time.
Once reactivated by a dialog update, it computes the passed time and
applies the result to the animator. However, the animation was most likely
started by the update not during the sleep. So the passed time must not
be applied to the animation in this case. Otherwise, many animation steps
are computed at once within a single visible frame.

Furthermore, the patch adjusts the REDRAW_PERIOD to 2, which is a better
value for geometric movements as opposed to mere color-blending effects
where the frame rate does not matter so much.

It also refines the nitpicker-buffer relocation in a way that extends
the buffer but does not shrink it. This lowers the interaction with
nitpicker in situations where the dialog size changes a lot.
This commit is contained in:
Norman Feske 2017-08-18 08:46:41 +02:00 committed by Christian Helmuth
parent cdebd0a994
commit bb52181bc5

View File

@ -129,7 +129,7 @@ struct Menu_view::Main
/**
* Number of frames between two redraws
*/
enum { REDRAW_PERIOD = 4 };
enum { REDRAW_PERIOD = 2 };
/**
* Counter used for triggering redraws. Incremented in each frame-timer
@ -177,10 +177,16 @@ void Menu_view::Main::_handle_dialog_update()
* processing immediately. This way, we avoid latencies when the dialog
* model is updated sporadically.
*/
if (_timer.curr_frame() != _last_frame)
unsigned const curr_frame = _timer.curr_frame();
if (curr_frame != _last_frame) {
if (curr_frame - _last_frame > 10)
_last_frame = curr_frame;
_handle_frame_timer();
else
} else {
_timer.schedule();
}
}
@ -243,7 +249,7 @@ void Menu_view::Main::_handle_frame_timer()
if (_animator.active()) {
unsigned const passed_frames = curr_frame - _last_frame;
unsigned const passed_frames = max(curr_frame - _last_frame, 4U);
if (passed_frames > 0) {
@ -263,7 +269,7 @@ void Menu_view::Main::_handle_frame_timer()
Area const old_size = _buffer.constructed() ? _buffer->size() : Area();
Area const size = _root_widget.min_size();
if (!_buffer.constructed() || size != old_size)
if (!_buffer.constructed() || size.w() > old_size.w() || size.h() > old_size.h())
_buffer.construct(_nitpicker, size, _env.ram(), _env.rm());
else
_buffer->reset_surface();