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<int>(stick_x_rf * 45) !=
+                static_cast<int>(axis_values[index].raw_value.x() * 45) ||
+            static_cast<int>(-stick_y_rf * 45) !=
+                static_cast<int>(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;