为什么触摸事件会破坏我的Android帧率?

15

我正在为 Android 开发一款游戏。它有很多功能,但运行得相当平稳。当然,直到用户触碰屏幕。

当用户触摸屏幕时,onTouchEvent 被调用(带有 action = ACTION_MOVEx = 0y = 0),大约每十毫秒一次。它看起来是以相当高的优先级运行的,因为它完全破坏了帧率。一旦触摸结束,帧率就恢复到正常状态。

我已经尝试过:

  • 像往常一样让 onTouchEvent 处理游戏输入
  • onTouchEvent 立即返回 true
  • 根本不实现 onTouchEvent

这个问题在所有三种情况下都存在。

有没有人遇到过这个问题?是否有降低生成 ACTION_MOVE 事件速率的方法,或者保证只有在实际移动时才会生成事件,或者使用轮询方法只获取触摸的当前位置?甚至只是禁用它的方法?

5个回答

14

点击查看这个帖子。基本上,您需要让事件线程休眠,否则系统将会产生大量的事件(因为在x、y和压力之间总是有一些运动),您需要处理这些事件。


1
我一直在尝试跟进你们讨论的一切,但是我必须承认,在尝试了几种实现你们建议的方法后,我仍然没有能够取得任何积极的结果。你们中的某个人可以提供一些示例代码吗?具体来说,我想知道如何使主/UI线程休眠。如果适用于我的游戏,也很好知道如何设置像Jon实现的轮询模型。
这是我的代码样子。在UI线程上:
public boolean onTouchEvent(MotionEvent event) {
    // Store event somewhere the game thread can see it:
    // ...

    synchronized (someObject) {
        try {
            someObject.wait(1000L);
        } catch (InterruptedException e) {
        }
    }

    return true;
}

并且在游戏线程上:

void myGame() {
    while (!stopping) {
        // ...

        // Get a touch event:
        synchronized (someObject) {
            someObject.notify();
        }
        Thread.yield();

        // ...
    }
}

0
通常事件都带有时间戳属性,因此很容易计算和限制事件速率。

if (currentEventTimestamp - lastEventTimestamp > 500) { 

    lastEventTimestamp = currentEventTimestamp;

    // do something 

}


0
也许这是一个有些明显的解决方案,但是......你尝试过只处理其中的十分之一吗?如果您正在UI线程上执行每10毫秒触发一次的处理,那么很可能会降低帧率。那么如果您只积累一个计数器,并且仅在超过某个最小阈值时进行任何处理,该怎么办呢?

0
如果您想要一种无需处理同步线程的解决方案,我可以推荐使用Handler接口将事件和相关数据使用Message/Bundle发送到游戏渲染线程。这里提到的睡眠解决方法仍然适用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接