针对计时关键游戏的Android触摸输入延迟问题。在调用onTouchEvent之前是否有延迟?

时间:2011-11-17 19:45:24

标签: java android android-ndk

所以我们正在研究iPhone游戏Snake Race的Android版本(这是一款很酷的游戏)。但是,我们似乎对触摸输入的延迟大到足以产生影响。 (蛇可能比你想要的更晚一步)在几乎习惯了Android版本之后,iPhone版本感觉就像是一种祝福。

问题是在调用onTouchEvent()方法时是否存在来自机器人方面的延迟? (我正在使用三星Galaxy S2)如果是这样,是否有任何巧妙的技巧来规避这个问题?(即使这意味着使用NDK)

这是当前的实施触摸处理:

public boolean onTouchEvent(final MotionEvent event) {      
    int action = event.getAction();
    if(action == MotionEvent.ACTION_DOWN || 
            (action & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_POINTER_DOWN){     
        Run run = GameVars.run;

        if(run != null){
            if(run.paused){
                run.paused = false;
            }else{
                if(event.getX(action >> MotionEvent.ACTION_POINTER_ID_SHIFT) < GameVars.width/2){
                    run.addTap(-1);

                }else{
                    run.addTap(1);

                }
            }
        }
        return true;
    }
    return false;
}

这是addTap方法:

public void addTap(int newDir) {
    if(newDir == -tapDir){
        taps++;
        tapDir *= -1;
    }
}

然后检查每一帧,点击,如果它大于零(我们被允许转动atm),我们转向。

一切正常并且可靠,但是有一致的延迟(可能2-3帧,足以让iPhone蛇更加机动化)。

任何反馈都是适用的!

4 个答案:

答案 0 :(得分:2)

我已经意识到这确实是设备侧面的延迟。它不大但它存在,并且它在不同的Android手机之间变化很大。我的Galaxy S2比我测试的大多数新款HTC型号都有更大的延迟。我也做了一个新的项目,触摸开关背景/播放声音(我知道有一个额外的延迟)等等。我似乎找不到任何可以解决问题的东西。

答案 1 :(得分:1)

这不是一个解决方案,而是直接回答你的问题:不,Android的触摸事件没有延迟。

代码中的某处是问题的根源。它可能是各种各样的事情。

例如,java是一种多线程语言,因此代码不一定以线性方式运行。 Android UI线程将在与Surface不同的线程上运行,因此它们可能无法按预期方式同步。

另一种可能性是你的控件没有被触及。触摸区域小吗? iPhone拥有出色的响应式触摸屏,但并非所有Android设备都具有相同的质量。

我希望我知道具体的原因,但是我可以让你安全地消除“它只是怪异的机器人”的可能性。操作系统没有延迟。

答案 2 :(得分:1)

我认为这是Android或设备问题。在开发基于NDK和GLES的应用程序时,我遇到与Galaxy Tab 10.1,Galaxy Note和Galaxy S II设备相同的问题,即与iOS设备相比,所有“星系”上的实际触摸和接收事件之间的滞后取决于当前的gpu / cpu利用率,即使main(事件处理)线程什么也不做,除了处理这些事件和所有渲染以及其他事情都是在分离的线程中执行...

答案 3 :(得分:0)

确保在处理click事件时垃圾收集器不会运行。如果是这样,请在游戏运行时禁用垃圾收集。否则,你在你的ui周期中做了一些昂贵的事情,导致口吃。分析您的应用程序应该揭示问题。