2009-04-27 82 views
14

我正在开发Android游戏。它有很多事情正在进行,但运行得相当顺利。当然,直到用户触摸屏幕。为什么触摸事件会破坏我的Android帧速率?

,当他们接触它,onTouchEvent被称为(与action = ACTION_MOVEx = 0y = 0)大致在一次似乎是一个相当高的优先级,因为它绝对抹杀帧率每十毫秒。一旦触摸结束,帧速率恢复到其良好状态。

我已经试过

  • 具有游戏照常
  • onTouchEvent手柄输入有onTouchEvent回报true马上
  • onTouchEvent在所有

实现不具有问题仍然存在在所有三种情况下。

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

回答

12

Read此主题。基本上你想睡觉事件线程,因为否则系统会抽出很多事件(x,y和压力之间总是有一些动作在进行),你需要处理。

+0

链接不再起作用。 – 2017-04-29 00:05:18

0

也许是一个有点明显的解决方案,但是......你试过只处理大约1/10的问题吗?如果你正在UI线程上每隔10ms触发一次处理,那很可能会降低帧率,是的。那么如果你只是积累了一个计数器而只是做了任何一次处理,而这只是通过了一些最小的阈值?

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

如果您希望在不必处理线程同步,我可以推荐使用的处理器接口发送事件和相关的解决方案数据使用Message/Bundle到游戏渲染线程。这里暗示的睡眠解决方法仍然适用。

0

通常事件带有timestamp属性,所以计算和节制事件速率很容易。

if (currentEventTimestamp - lastEventTimestamp > 500) { 
 

 
    lastEventTimestamp = currentEventTimestamp; 
 

 
    // do something 
 

 
}

相关问题