响应非触摸事件时帧率低

Poor framerate when responding to non touch events

这是我的问题:我正在开发一种音乐游戏,用户可以在其中从 midi 键盘输入 android(我正在使用此库:https://github.com/kshoji/USB-MIDI-Driver)。对于我的主要游戏布局,我使用了表面视图和游戏循环。我将我的 onDraw() 优化为非常 quick,但无论出于何种原因,使用外部 MIDI 键盘时我的帧速率比在屏幕键盘上使用触摸时慢得多。

起初我认为这是由于键盘驱动程序的开销,但后来我注意到当我触摸屏幕时,帧率不再不稳定,即使我正在使用 midi 键盘演奏。有谁知道为什么会这样? android 是否对响应触摸事件的 ui 更新进行某种背景优化?谢谢

编辑:我已经了解了有关我的问题的更多信息。基本上,我的设备正在做的是将 CPU 速度设置为低速以节省电量。该策略(由 CPU 调控器定义)是在用户触摸屏幕时提高 cpu 速度,并在未检测到任何触摸时降低 cpu 时钟速度。我的问题是,由于我想通过外部设备进行交互,而不是通过触摸事件进行交互,因此 cpu 很慢,结果帧率很差。如果您有 root 访问权限,显然有一些方法可以覆盖它……但我宁愿不求助于那个:/。如果有人有任何技巧或想法,请告诉我。

正如您所指出的,问题是激进的节能代码。 this answer.

中有一些注释和一些链接

如果您的应用在 CPU 上做大量工作,它就不会节流。因此,一种黑客/解决方法是让一个线程只是坐着旋转。不过,这是一个非常糟糕的主意,因为它会对设备的电池寿命产生不利影响。

如果您的唯一问题是显示不稳定,而不是更严重的问题(例如从外部设备丢失数据),那么您可以通过在应用落后时丢帧来解决该问题。引用链接的答案:

The problem is that the system is aggressively reducing clock speeds to save power when it doesn't detect interaction with the user. (Qualcomm in particular seems fond of this.) The workaround is to drop frames when necessary. See this article on game loops, and a Choreographer-based trick demonstrated in Grafika's "record GL app" activity (in doFrame()).