Visual Studio下VR输入重映射传指针后函数内buttonId异常为0问题
问题根因分析
你遇到的参数传递后字段值异常问题,90%以上是结构体内存布局不一致导致的,具体可分为以下两类常见情况:
- 编译对齐规则不统一
如果你的VRInputEmulator是单独编译的静态库/动态库,和上层调用的VRInputRemapping项目用了不同的结构体内存对齐配置:比如某一侧加了#pragma pack(1)强制1字节对齐没恢复,或者VS项目属性里的「结构成员对齐」设置不一样,就会导致同一个结构体的字段偏移量计算出现偏差。你在调用方侧按照自己的偏移把buttonId写到了偏移X的位置,被调用方按照自己的偏移去偏移Y的位置读,刚好读到了值为0的其他字段,就会出现你看到的现象。 - 结构体定义两边不一致
你调用方使用的vrinputemulator::DigitalBinding、vrinputemulator::DigitalInputRemapping头文件定义,和编译VRInputEmulator库时使用的头文件定义不匹配:比如库侧的openvr结构体里比你手里的头文件多了1个保留字段、或者buttonId的类型定义不同(比如你这边是uint32_t,库侧是uint16_t),都会导致字段偏移错误,读取到错误的值。
排查方案
- 确认两个项目的编译对齐配置一致:打开VS项目属性 -> C/C++ -> 代码生成 -> 结构成员对齐,两边都设置为默认8字节即可,检查代码里有没有局部修改
#pragma pack后没恢复的情况。 - 对比两边用到的
DigitalBinding、DigitalInputRemapping以及内部嵌套的所有结构体定义,确保完全一致,调用方直接引用库侧的原版头文件,不要私自复制修改。 - 可以临时加日志验证:在调用方打印
(uint64_t)&(m_currentRemapping->binding.data.openvr.buttonId) - (uint64_t)m_currentRemapping,在被调用方打印(uint64_t)&(remapping->binding.data.openvr.buttonId) - (uint64_t)remapping,两个值如果不一样,就可以实锤是结构体布局不一致的问题。
内容的提问来源于stack exchange,提问作者a zou
相关产品推荐
相关产品推荐

