日期:2014-05-20  浏览次数:20738 次

关于手机游戏按键响应的问题
游戏有两个线程
一个主线程继承自GameCanvas,负责响应按键,实现逻辑
另一个线程负责绘制画面,绘制完一帧后马上绘制下一帧(一帧大约100毫秒)
游戏对按键的实时性要求非常高,需要连续按键

现在的问题是:主线程响应按键非常慢
如果用keyPressed获取键盘操作,要2秒才能在画面上反应出来
如果用getKeyStates来获取键盘操作,即在每一帧的开始检测按键的状态,则得到的不是当时的状态,而是之前的.比如:我按下一个方向键上,这个按键状态会被之后的8-9帧读取到

请问如何实现按键的高速响应?谢谢



------解决方案--------------------
首先,你两个线程,一个负责按键响应另一个负责绘画,就有问题。
因为底层是由同一个UI线程来负责绘屏幕更新和按键的回调的。。。你得想着这个来协调线程。
一种加速是,把按键接收和绘图线程压力减至最轻。比如说按键里只接收记录按键不处理按键相关的逻辑,绘图里只把屏幕缓冲区更新到手机屏幕,这样可以让系统UI线程压力最小,能尽可能快的处理硬件消息。
还有,考虑使用按键消息队列,保证对于游戏逻辑来说不丢失任何按键信息,即使时间已经不同步。
最根本的,要尽量加快主线程处理按键包括绘制动作。绘制是个呈现过程,但是你的按键结果得不到呈现,那也不行。假如100ms刷新一次,那主线程消费速度就是10条/秒。如果你要有即时响应速度不丢键,那消费速度肯定要大于生产速度。而实际上硬件按键响应肯定是高于这个速度的。具体是多少就不知道老。要问硬件厂商。
------解决方案--------------------
UP
------解决方案--------------------
up

------解决方案--------------------
不要分成两个线程来处理,我觉得还是使用keyPressed来处理,加上连续键的处理就好,至于快速响应,1S内能响应8次左右已经满足了,如果再快,其实人感觉上应该没有区别的吧