From d6a0975e5d83ccd18543245ac880e0c57f6e0bca Mon Sep 17 00:00:00 2001 From: german Date: Tue, 2 Feb 2021 22:32:45 -0600 Subject: Refresh controller only when necessary --- .../configure_input_player_widget.cpp | 51 +++++++++++++++------- .../configuration/configure_input_player_widget.h | 1 + 2 files changed, 37 insertions(+), 15 deletions(-) diff --git a/src/yuzu/configuration/configure_input_player_widget.cpp b/src/yuzu/configuration/configure_input_player_widget.cpp index 1b0665805..1e3251547 100644 --- a/src/yuzu/configuration/configure_input_player_widget.cpp +++ b/src/yuzu/configuration/configure_input_player_widget.cpp @@ -11,10 +11,10 @@ PlayerControlPreview::PlayerControlPreview(QWidget* parent) : QFrame(parent) { UpdateColors(); QTimer* timer = new QTimer(this); - connect(timer, &QTimer::timeout, this, QOverload<>::of(&PlayerControlPreview::update)); + connect(timer, &QTimer::timeout, this, QOverload<>::of(&PlayerControlPreview::UpdateInput)); - // refresh at 40hz - timer->start(25); + // refresh at 60hz + timer->start(16); } PlayerControlPreview::~PlayerControlPreview() = default; @@ -155,12 +155,8 @@ void PlayerControlPreview::UpdateColors() { // colors.right = QColor(Settings::values.players.GetValue()[player_index].body_color_right); } -void PlayerControlPreview::paintEvent(QPaintEvent* event) { - QFrame::paintEvent(event); - QPainter p(this); - p.setRenderHint(QPainter::Antialiasing); - const QPointF center = rect().center(); - +void PlayerControlPreview::UpdateInput() { + bool input_changed = false; const auto& button_state = buttons; for (std::size_t index = 0; index < button_values.size(); ++index) { bool value = false; @@ -169,7 +165,10 @@ void PlayerControlPreview::paintEvent(QPaintEvent* event) { } bool blink = mapping_active && index == button_mapping_index; if (analog_mapping_index == Settings::NativeAnalog::NUM_STICKS_HID) { - blink &= blink_counter > 12; + blink &= blink_counter > 25; + } + if (button_values[index] != value || blink) { + input_changed = true; } button_values[index] = value || blink; } @@ -178,17 +177,42 @@ void PlayerControlPreview::paintEvent(QPaintEvent* event) { for (std::size_t index = 0; index < axis_values.size(); ++index) { const auto [stick_x_f, stick_y_f] = analog_state[index]->GetStatus(); const auto [stick_x_rf, stick_y_rf] = analog_state[index]->GetRawStatus(); + + if (static_cast(stick_x_rf * 45) != + static_cast(axis_values[index].raw_value.x() * 45) || + static_cast(-stick_y_rf * 45) != + static_cast(axis_values[index].raw_value.y() * 45)) { + input_changed = true; + } + axis_values[index].properties = analog_state[index]->GetAnalogProperties(); axis_values[index].value = QPointF(stick_x_f, -stick_y_f); axis_values[index].raw_value = QPointF(stick_x_rf, -stick_y_rf); const bool blink_analog = mapping_active && index == analog_mapping_index; if (blink_analog) { + input_changed = true; axis_values[index].value = - QPointF(blink_counter < 12 ? -blink_counter / 12.0f : 0, - blink_counter > 12 ? -(blink_counter - 12) / 12.0f : 0); + QPointF(blink_counter < 25 ? -blink_counter / 25.0f : 0, + blink_counter > 25 ? -(blink_counter - 25) / 25.0f : 0); } } + + if (input_changed) { + update(); + } + + if (mapping_active) { + blink_counter = (blink_counter + 1) % 50; + } +} + +void PlayerControlPreview::paintEvent(QPaintEvent* event) { + QFrame::paintEvent(event); + QPainter p(this); + p.setRenderHint(QPainter::Antialiasing); + const QPointF center = rect().center(); + switch (controller_type) { case Settings::ControllerType::Handheld: DrawHandheldController(p, center); @@ -207,9 +231,6 @@ void PlayerControlPreview::paintEvent(QPaintEvent* event) { DrawProController(p, center); break; } - if (mapping_active) { - blink_counter = (blink_counter + 1) % 24; - } } void PlayerControlPreview::DrawLeftController(QPainter& p, const QPointF center) { diff --git a/src/yuzu/configuration/configure_input_player_widget.h b/src/yuzu/configuration/configure_input_player_widget.h index 7d0653faa..33a5482ba 100644 --- a/src/yuzu/configuration/configure_input_player_widget.h +++ b/src/yuzu/configuration/configure_input_player_widget.h @@ -32,6 +32,7 @@ public: void BeginMappingButton(std::size_t button_id); void BeginMappingAnalog(std::size_t button_id); void EndMapping(); + void UpdateInput(); protected: void paintEvent(QPaintEvent* event) override; -- cgit v1.2.3