diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/Keyboard.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/Keyboard.cs
index 7c5419f2..5daa7d32 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/Keyboard.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/Keyboard.cs
@@ -27,8 +27,6 @@ namespace AxibugEmuOnline.Client.InputDevices
         {
             internal KeyCode m_keycode;
 
-            public override bool Performing => Device.Resolver.GetKey(Device as KeyBoard, m_keycode);
-
             internal KeyboardKey(KeyCode listenKey, KeyBoard keyboard)
                 : base(keyboard)
             {
@@ -36,16 +34,6 @@ namespace AxibugEmuOnline.Client.InputDevices
             }
 
             public override string ControlName => m_keycode.ToString();
-
-            public override Vector2 GetVector2()
-            {
-                return default(Vector2);
-            }
-
-            public override float GetFlaot()
-            {
-                return Performing ? 1 : 0;
-            }
         }
     }
 
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/PSVController.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/PSVController.cs
index 2183a0de..7b037956 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/PSVController.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/PSVController.cs
@@ -21,7 +21,6 @@ namespace AxibugEmuOnline.Client.InputDevices
         public Button Right { get; private set; }
         public Button Down { get; private set; }
         public Button Left { get; private set; }
-
         public Stick LeftStick { get; private set; }
         public Stick RightStick { get; private set; }
 
@@ -31,54 +30,40 @@ namespace AxibugEmuOnline.Client.InputDevices
         {
             List<InputControl> result = new List<InputControl>();
 
-            Cross = new Button(KeyCode.Joystick1Button0, this, "X");
-            Circle = new Button(KeyCode.Joystick1Button1, this, "⭕");
-            Square = new Button(KeyCode.Joystick1Button2, this, "□");
-            Triangle = new Button(KeyCode.Joystick1Button3, this, "△");
+            Cross = new Button(this, "X");
+            Circle = new Button(this, "⭕");
+            Square = new Button(this, "□");
+            Triangle = new Button(this, "△");
 
-            L = new Button(KeyCode.Joystick1Button4, this, "L");
-            R = new Button(KeyCode.Joystick1Button5, this, "R");
+            L = new Button(this, "L");
+            R = new Button(this, "R");
 
-            Select = new Button(KeyCode.Joystick1Button6, this, "SELECT");
-            Start = new Button(KeyCode.Joystick1Button7, this, "START");
+            Select = new Button(this, "SELECT");
+            Start = new Button(this, "START");
 
-            Up = new Button(KeyCode.Joystick1Button8, this, "UP");
-            Right = new Button(KeyCode.Joystick1Button9, this, "RIGHT");
-            Down = new Button(KeyCode.Joystick1Button10, this, "DOWN");
-            Left = new Button(KeyCode.Joystick1Button11, this, "LEFT");
+            Up = new Button(this, "UP");
+            Right = new Button(this, "RIGHT");
+            Down = new Button(this, "DOWN");
+            Left = new Button(this, "LEFT");
 
             return result;
         }
 
         public class Button : InputControl
         {
-            private KeyCode m_keyCode;
-            private string m_controlName;
+            internal string m_controlName;
 
-            public Button(KeyCode keycode, InputDevice device, string controlName) : base(device)
+            public Button(InputDevice device, string controlName) : base(device)
             {
-                m_keyCode = keycode;
                 m_controlName = controlName;
             }
 
-            public override bool Performing => Input.GetKey(m_keyCode);
-
-            public override Vector2 GetVector2()
-            {
-                return default;
-            }
-
-            public override float GetFlaot()
-            {
-                return Performing ? 1 : 0;
-            }
-
             public override string ControlName => m_controlName;
         }
 
         public class Stick : InputControl
         {
-            private bool m_left;
+            internal bool m_left;
 
             public VirtualButton UP { get; private set; }
             public VirtualButton Down { get; private set; }
@@ -112,31 +97,6 @@ namespace AxibugEmuOnline.Client.InputDevices
                 Right.Update();
             }
 
-            public override bool Performing => GetVector2().x != 0 || GetVector2().y != 0;
-
-            public override Vector2 GetVector2()
-            {
-                Vector2 result = Vector2.zero;
-
-                if (m_left)
-                {
-                    result.x = Input.GetAxis("Horizontal");
-                    result.y = Input.GetAxis("Vertical");
-                }
-                else
-                {
-                    result.x = Input.GetAxis("HorizontalR");
-                    result.y = Input.GetAxis("VerticalR");
-                }
-
-                return result;
-            }
-
-            public override float GetFlaot()
-            {
-                return Performing ? 1 : 0;
-            }
-
             public override string ControlName => $"{nameof(Stick)}_{(m_left ? "left" : "right")}";
 
             public class VirtualButton : InputControl
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/InputDevicesManager.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/InputDevicesManager.cs
index 9192e59a..b4fff468 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/InputDevicesManager.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/InputDevicesManager.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Collections.Generic;
+using System.Collections.Generic;
 using UnityEngine;
 
 namespace AxibugEmuOnline.Client.InputDevices
@@ -129,13 +128,13 @@ namespace AxibugEmuOnline.Client.InputDevices
 
             bool m_performingLastFrame;
             /// <summary> 获取该控件是否在当前调用帧是否处于活动状态 </summary>
-            public abstract bool Performing { get; }
+            public virtual bool Performing => Device.Resolver.CheckPerforming(this);
 
             /// <summary> 获得该控件的以二维向量表达的值 </summary>
             /// <returns></returns>
-            public abstract Vector2 GetVector2();
+            public virtual Vector2 GetVector2() => Device.Resolver.GetVector2(this);
             /// <summary> 获得该控件的以浮点数表达的值 </summary>
-            public abstract float GetFlaot();
+            public virtual float GetFlaot() => Device.Resolver.GetFloat(this);
 
             internal void Update()
             {
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/InputResolver/InputResolver.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/InputResolver/InputResolver.cs
index ff78f612..390eafbd 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/InputResolver/InputResolver.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/InputResolver/InputResolver.cs
@@ -1,5 +1,6 @@
 using System.Collections.Generic;
 using UnityEngine;
+using UnityEngine.InputSystem;
 
 namespace AxibugEmuOnline.Client.InputDevices
 {
@@ -55,13 +56,9 @@ namespace AxibugEmuOnline.Client.InputDevices
             OnDeviceConnected?.Invoke(connectDevice);
         }
 
-        /// <summary>
-        /// 获取一个键盘设备的指定按键当前调用帧是否处于按下状态
-        /// </summary>
-        /// <param name="keyboard">键盘设备实例,来自Resolver提供的设备实例</param>
-        /// <param name="key">键盘按键枚举值</param>
-        public abstract bool GetKey(KeyBoard keyboard, KeyCode key);
-
+        public abstract bool CheckPerforming<CONTROLLER>(CONTROLLER control) where CONTROLLER : InputDevice.InputControl;
+        public abstract Vector2 GetVector2<CONTROLLER>(CONTROLLER control) where CONTROLLER : InputDevice.InputControl;
+        public abstract float GetFloat<CONTROLLER>(CONTROLLER control) where CONTROLLER : InputDevice.InputControl;
         /// <summary>
         /// 获得输入设备的唯一名称
         /// </summary>
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/InputResolver/InputSystemResolver.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/InputResolver/InputSystemResolver.cs
index d70b2503..49a03c53 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/InputResolver/InputSystemResolver.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/InputResolver/InputSystemResolver.cs
@@ -1,6 +1,7 @@
 #if ENABLE_INPUT_SYSTEM
 using System.Collections.Generic;
 using UnityEngine;
+using UnityEngine.InputSystem;
 using UnityEngine.InputSystem.Controls;
 using IP = UnityEngine.InputSystem.InputSystem;
 using IPDevice = UnityEngine.InputSystem.InputDevice;
@@ -68,18 +69,37 @@ namespace AxibugEmuOnline.Client.InputDevices.ForInputSystem
             return m_devices.Values;
         }
 
-        public override bool GetKey(KeyBoard keyboard, KeyCode key)
+        public override bool CheckPerforming<CONTROLLER>(CONTROLLER control)
         {
-            if (m_devices.TryGetKey(keyboard, out var ipdev))
+            if (control.Device is KeyBoard keyboard)
             {
-                var ipKeyboard = ipdev as IPKeyboard;
-                if (ipKeyboard == null) return false;
+                if (control is KeyBoard.KeyboardKey key)
+                {
+                    if (m_devices.TryGetKey(keyboard, out var ipdev))
+                    {
+                        var ipKeyboard = ipdev as IPKeyboard;
+                        if (ipKeyboard == null) return false;
 
-                var k = GetIPKeyboardKey(ipKeyboard, key);
-                return k.isPressed;
+                        var k = GetIPKeyboardKey(ipKeyboard, key.m_keycode);
+                        return k.isPressed;
+                    }
+
+                    return false;
+                }
             }
 
-            return false;
+
+            throw new System.NotImplementedException();
+        }
+
+        public override Vector2 GetVector2<CONTROLLER>(CONTROLLER control)
+        {
+            throw new System.NotImplementedException();
+        }
+
+        public override float GetFloat<CONTROLLER>(CONTROLLER control)
+        {
+            throw new System.NotImplementedException();
         }
     }
 
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/InputResolver/PSVResolver.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/InputResolver/PSVResolver.cs
index cc8f5b4f..1c7ee738 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/InputResolver/PSVResolver.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/InputResolver/PSVResolver.cs
@@ -1,5 +1,8 @@
-using System.Collections.Generic;
+using NUnit.Framework.Internal;
+using System.Collections.Generic;
 using UnityEngine;
+using static Essgee.Emulation.Audio.DMGAudio;
+using static VirtualNes.Core.APU_INTERNAL;
 
 namespace AxibugEmuOnline.Client.InputDevices.ForPSV
 {
@@ -24,16 +27,71 @@ namespace AxibugEmuOnline.Client.InputDevices.ForPSV
             return device == m_psvController;
         }
 
-        public override bool GetKey(KeyBoard keyboard, KeyCode key)
-        {
-            return Input.GetKeyDown(key);
-        }
-
         public override string GetDeviceName(InputDevice inputDevice)
         {
             Debug.Assert(inputDevice == m_psvController, "只支持psv控制器");
 
             return nameof(PSVController);
         }
+
+        public override bool CheckPerforming<CONTROLLER>(CONTROLLER control)
+        {
+            if (control.Device is PSVController psvCon)
+            {
+                if (control is PSVController.Button button)
+                {
+                    if (button == psvCon.Cross) return Input.GetKey(KeyCode.Joystick1Button0);
+                    else if (button == psvCon.Circle) return Input.GetKey(KeyCode.Joystick1Button1);
+                    else if (button == psvCon.Square) return Input.GetKey(KeyCode.Joystick1Button2);
+                    else if (button == psvCon.Triangle) return Input.GetKey(KeyCode.Joystick1Button3);
+                    else if (button == psvCon.L) return Input.GetKey(KeyCode.Joystick1Button4);
+                    else if (button == psvCon.R) return Input.GetKey(KeyCode.Joystick1Button5);
+                    else if (button == psvCon.Select) return Input.GetKey(KeyCode.Joystick1Button6);
+                    else if (button == psvCon.Start) return Input.GetKey(KeyCode.Joystick1Button7);
+                    else if (button == psvCon.Up) return Input.GetKey(KeyCode.Joystick1Button8);
+                    else if (button == psvCon.Right) return Input.GetKey(KeyCode.Joystick1Button9);
+                    else if (button == psvCon.Down) return Input.GetKey(KeyCode.Joystick1Button10);
+                    else if (button == psvCon.Left) return Input.GetKey(KeyCode.Joystick1Button11);
+                }
+                else if (control is PSVController.Stick stick)
+                {
+                    var vec2 = stick.GetVector2();
+                    return vec2.x != 0 || vec2.y != 0;
+                }
+            }
+
+            throw new System.NotImplementedException();
+        }
+
+        public override Vector2 GetVector2<CONTROLLER>(CONTROLLER control)
+        {
+            if (control.Device is PSVController)
+            {
+                if (control is PSVController.Stick stick)
+                {
+                    Vector2 result = Vector2.zero;
+
+                    if (stick.m_left)
+                    {
+                        result.x = Input.GetAxis("Joy1 Axis X");
+                        result.y = Input.GetAxis("Joy1 Axis Y");
+                    }
+                    else
+                    {
+                        result.x = Input.GetAxis("Joy1 Axis 4");
+                        result.y = Input.GetAxis("Joy1 Axis 5");
+                    }
+
+                    return result;
+                }
+            }
+
+            throw new System.NotImplementedException();
+        }
+
+        public override float GetFloat<CONTROLLER>(CONTROLLER control)
+        {
+            throw new System.NotImplementedException();
+        }
     }
 }