为啥触摸事件会破坏我的 Android 帧率?
Posted
技术标签:
【中文标题】为啥触摸事件会破坏我的 Android 帧率?【英文标题】:Why are touch events destroying my Android framerate?为什么触摸事件会破坏我的 Android 帧率? 【发布时间】:2010-10-21 23:42:31 【问题描述】:我正在开发一款适用于 android 的游戏。它发生了很多事情,但运行得相当顺利。当然,在用户触摸屏幕之前。
当他们触摸它时,大约每十毫秒调用一次onTouchEvent
(与action = ACTION_MOVE
、x = 0
和y = 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 帧率?的主要内容,如果未能解决你的问题,请参考以下文章
Chrome 移动模拟器中的 ReactJS 升级破坏了触摸事件