上个周末还没问题的代码,周一来了编译发现键盘控制出了问题,方向键按下没有反应,只有长时间按下的时候镜头偶尔会移动一下,也就是要N帧才能响应到一次键盘操作。
what's wrong? 谁动了我的代码?
F5,调试起来,发现键盘消息相应没有任何问题,每次都能捕获到,而偏移量mTranslateVector的值也确实有变化,但是到了movecamera的时候mTranslateVector就变为零了!那问题出在哪呢?
静下来仔细回想下,期间我的确没有更改过代码,那问题出在哪呢?继续调试,发现在ogre 的 ExampleFrameListener.h 文件的frameStarted函数里面有这样一句
- //Check if one of the devices is not buffered
- if( !mMouse->buffered() || !mKeyboard->buffered() || !buffJ )
- {
- ...
- mTranslateVector = Ogre::Vector3::ZERO;
- }
而且每次都会执行到这个赋值语句,是这条语句将之前的按键响应赋值清零了,这样再进入到movecam函数的时候,速度为0,自然镜头就不会移动了。注释掉这一句,编译,加载场景,镜头移动正常,问题暂时解决。
但是?the devices is not buffered ?我使用的是缓冲输入,而且按键一直被按下,居然在程序中被判断成为not buffered,肯定是某个地方出了问题。
既然软件没问题,会不会是硬件上的改动导致的?我再回想,周末的时候为了玩街机,装了个游戏手柄,会不会和这个有关系呢?
立马动手,拔下手柄,取消掉刚才的注释,编译运行。OK!一切正常!
为了更精确的找到问题原因,我把手柄拿到另一台机器上装好,然后再跑程序,发现一切正常。
对比下两台机器,发现唯一不同的就是,第一台出问题的机器,键盘鼠标都是USB接口的,而手柄正好也是。
好了,问题到此,大致可归结为,当系统使用多个usb输入设备时,会对ois的缓冲输入的缓冲判断造成影响,导致一些逻辑上的错误。