意外的android系统调用可以平滑显示滚动图形的口吃

时间:2011-12-01 11:39:53

标签: android graphics scroll system real-time

我目前正在编写一个应该以滚动方式显示实时测量曲线的应用程序(想想ECG记录仪或示波器)。 UI-Thread中的意外系统调用会使显示结果不稳定。

数据通过蓝牙滚动。一切正常,显示平滑滚动,平均更新速率为26帧/秒。但是,显示器显得异常严重。

我使用traceview获得更多洞察力,并且根据traceview,口吃是android/view/ViewRoot.handleMessage呼叫的结果,平均每次呼叫持续131毫秒。 如果我在traceview中进一步挖掘,则循环在android/view/ViewRoot.performTraversals内被烧毁。这些CPU周期的92%主要用于android/view/View.measure的递归调用。

由于递归调用结构,它从那里变得复杂。但我可以找到对LinearLayout,FrameLayout和RelativeLayout的onMeasure()方法的调用。每种布局类型的onMeasure()方法消耗大约相同的CPU周期。这很奇怪,因为在我的活动中我只使用一个简单的LinearLayout只有2个元素。 我没看到为什么假设重新布局一个带有2个元素的LinearLayout执行对未使用的布局的调用,并且需要高达131毫秒的时间才能做到这一点。

更多信息:

  • 平台HTC渴望HD与Android 2.3.1。
  • 我使用处理程序在UI线程中执行绘图。
  • 布局是一个简单的LinearLayout,包含2个元素:自定义视图和textField。
  • 状态栏隐藏有getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
  • 对每个新数据块执行绘图,该数据块大约到达。每50毫秒。
  • 绘图本身使用画布,其性能足以跟上传入的数据。

经过长时间的解释,以下是问题:

  1. 什么是调用android / view / ViewRoot.handleMessage? (每隔850毫秒调用相对相等的间隔,没有明显的链接(没有直接调用,调用次数和相对位置没有链接到绘图的消息处理程序)到我的Activity的任何活动)
  2. 如何禁止调用android / view / ViewRoot.handleMessage或如何让它们更快(我的LinearLayout中只有2个元素)
  3. 对未使用布局的调用首先让我想到了状态栏或一些隐藏的活动(例如主屏幕),它们可能会使用这种布局。但是为什么这些电话是我活动的一部分呢?据我所知,跟踪应该只跟踪活动进程。例如产生实时数据的服务调用不是跟踪的一部分。
  4. 是否有可能跟踪某些系统组件的个别呼叫?当我放大traceview时,我会看到此调用序列:toplevel -> android/os/Message.clearForRecycle() -> android/os/MessageQueue.nativePollOnce() -> android/os/SystemClock.uptimeMillis() -> com/htc/profileflag/ProfileConfig.getProfilePerformance() -> android/os/Handler.dispatchMessage() -> android/view/ViewRoot.performTraversals()
  5. 偏离主题:是否有可能导出traceview(parent-children-CPU time等)中显示的数据而不是截图?

1 个答案:

答案 0 :(得分:5)

好的,我找到了android/view/ViewRoot.handleMessage长途电话的原因。 这确实是由我的申请引起的。

我的应用程序有2个屏幕(活动),一个具有复杂的状态信息布局,另一个显示传入数据的实时显示。

通过蓝牙传入的数据包含混合的实时数据和状态数据。当我切换到实时Activity时,我在启动新的实时Activity后以finish();停止状态Activity。不幸的是,这还不足以阻止消息处理程序,它在UI线程中接收新的状态信息,并继续在不可见和完成的Activity中更新状态数据。此活动的重新布局导致了实时数据的断断续续。

现在已经解决了。显示滚动现在合理平滑。

感谢您的耐心等待。对于任何在stackoverflow上偶然遇到这个Thread的人来说,这可能会有用。

jepo