【问题标题】:Poor framerate when responding to non touch events响应非触摸事件时帧率低
【发布时间】:2015-08-29 19:56:00
【问题描述】:

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

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

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

【问题讨论】:

  • 您是否从您的onMidiNoteOn 处理程序调用postInvalidate() 以获得您的主视图?
  • 不,但我正在使用游戏循环来重绘活动,所以我认为不需要?
  • 如果以后有人光顾这里,我找到了有关 cpu 调控器策略和输入提升的源代码:android.googlesource.com/kernel/msm/+/…。不是特别有用,但我认为看看并确切了解引擎盖下发生的事情很有趣!文件 cpu-boost.c 包含由操作系统执行的“输入提升”的代码。
  • “dory”分支可能不是最好的例子,因为它适用于可穿戴设备,这些设备比手持设备对电源更加偏执。

标签: android optimization surfaceview midi frame-rate


【解决方案1】:

正如您所指出的,问题在于激进的节能代码。一些注释和一些链接在this answer

如果您的应用在 CPU 上做大量工作,它就不会被限制。因此,一种技巧/解决方法是拥有一个可以坐着旋转的线程。这是一个非常糟糕的主意,因为它会对设备的电池寿命产生不利影响。

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

问题在于,当系统未检测到与用户的交互时,系统会大幅降低时钟速度以节省电量。 (高通公司似乎特别喜欢这个。)解决方法是在必要时丢帧。请参阅this article 了解游戏循环,以及在Grafika's“记录 GL 应用程序”活动(doFrame())中演示的基于 Choreographer 的技巧。

【讨论】:

  • 感谢您的回复。问题是我的应用程序不应该处于空闲状态,并且用户在技术上是通过 USB 设备进行交互的。我只希望有某种方法可以告诉操作系统它需要响应!啊,好吧,我想我将不得不忍受我不稳定的帧速率。您提到的 grafika 解决方案会提高平滑度吗?
  • 我建议您尝试自己运行 Grafika。在 Nexus 5 上,“记录 GL 应用程序”活动会经常报告丢帧,但我从未注意到故障,除非系统中的其他东西占用了所有 CPU 时间并且它不得不连续丢帧 4 个。它以 60fps 的速度制作了一个非常简单的动画,因此不会对系统造成负担,但它经常有截止日期,而这正是节电代码所不擅长的。 FWIW,如果您在有根设备上在systrace 下运行您的应用程序,您可以看到各种时钟调整和 CPU 内核旋转上升/下降(参见例如 bigflake.com/systrace)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多