我正在进行一个涉及游戏手柄输入的Rust项目,使用
gilrs
库(游戏输入库)。目前,我用以下结构表示控制器的状态:
#[derive(Default, Clone)]
pub struct GamepadState {
axes: HashMap<gilrs::Axis, f32>,
buttons: HashMap<gilrs::Button, bool>
}
这种设计允许我使用以下方法轻松检索轴和按钮的状态:
impl GamepadState {
pub fn axis(&self, axis: gilrs::Axis) -> f32 {
self.axes.get(&axis).copied().unwrap_or(0_f32)
}
pub fn is_pressed(&self, button: gilrs::Button) -> bool {
self.buttons.get(&button).copied().unwrap_or(false)
}
}
这将允许在处理来自的事件时使用这样的代码
吉尔斯
:
match event {
gilrs::EventType::AxisChanged(c_axis, value, _) => {
gamepad_state.axes.insert(c_axis, value);
}
gilrs::EventType::ButtonPressed(c_button, _) => {
gamepad_state.buttons.insert(c_button, true);
}
gilrs::EventType::ButtonReleased(c_button, _) => {
gamepad_state.buttons.insert(c_button, false);
}
_ => {}
}
我选择了
HashMap
使实现灵活简洁,但不是零成本抽象。我想优化这个设计,以获得更好的性能,同时保持清洁和符合人体工程学的API访问状态。
如果我要替换
哈希图
,它看起来像这样:
match event {
gilrs::EventType::AxisChanged(c_axis, value, _) => {
use gilrs::Axis;
match c_axis {
Axis::LeftStickX => joystick_state.left_x = value,
Axis::LeftStickY => joystick_state.left_y = value,
Axis::RightStickX => joystick_state.right_x = value,
Axis::RightStickY => joystick_state.right_y = value,
}
},
// similar handling for buttons, which is worse because triggers and d-pad actions are also considered buttons in `gilrs`
}
但这种方法感觉笨拙,可扩展性较差。
我的问题:
-
我该如何重新设计这个
GamepadState
避免结构
哈希图
同时保持或提高性能?
-
在Rust中,有没有一种更好的方法来管理带有固定轴和按钮的游戏手柄状态,同时不牺牲人体工程学?
非常感谢您就惯用、高效和可扩展的解决方案提供任何建议!