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

Posted

技术标签:

【中文标题】为啥触摸事件会破坏我的 Android 帧率?【英文标题】:Why are touch events destroying my Android framerate?为什么触摸事件会破坏我的 Android 帧率? 【发布时间】:2010-10-21 23:42:31 【问题描述】:

我正在开发一款适用于 android 的游戏。它发生了很多事情,但运行得相当顺利。当然,在用户触摸屏幕之前。

当他们触摸它时,大约每十毫秒调用一次onTouchEvent(与action = ACTION_MOVEx = 0y = 0),这似乎是一个相当高的优先级,因为它完全消除了帧速率.触摸一结束,帧率就会恢复到正常状态。

我试过了

像往常一样拥有onTouchEvent 处理游戏输入 拥有onTouchEvent 立即返回true 根本没有实现onTouchEvent

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

有人遇到过吗?有没有办法降低ACTION_MOVE 事件的生成率,或者确保它们仅在实际移动时生成,或者使用仅获取当前触摸位置的轮询方法?或者甚至只是一种完全禁用它的方法?

【问题讨论】:

【参考方案1】:

Read 这个帖子。基本上你想要让事件线程休眠,否则系统会发送很多你需要处理的事件(在 x,y 和压力之间总是有一些运动发生)。

【讨论】:

【参考方案2】:

我一直在努力关注你们所说的一切 关于,但我必须承认,在尝试了几种实施方式之后 你的建议,我仍然无法实现任何积极的 结果。你们中的一个可以提供一些示例代码吗?具体来说, 我想知道如何让主/ 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();

        // ...
    

【讨论】:

【参考方案3】:

也许是一个有点明显的解决方案,但是......您是否尝试过只处理其中的大约 1/10?如果您在 UI 线程上每 10 毫秒触发一次处理,那可能会减慢帧速率,是的。那么,如果您只是稍微累积一个计数器,并且仅在超过某个最小阈值后才进行任何处理呢?

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

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

if (currentEventTimestamp - lastEventTimestamp > 500)  

    lastEventTimestamp = currentEventTimestamp;

    // do something 

【讨论】:

以上是关于为啥触摸事件会破坏我的 Android 帧率?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Rcpp 会破坏 xts 对象?

Chrome 移动模拟器中的 ReactJS 升级破坏了触摸事件

为啥 UIView 的这些自动布局约束会阻止 UIButton 子视图接收触摸事件?

Android触摸事件分发

为啥我的 UItextView 顶部的子视图没有被触摸?

android 点击,触摸事件