意外的android系统调用使滚动图形的显示变得流畅

意外的android系统调用使滚动图形的显示变得流畅,android,graphics,scroll,system,real-time,Android,Graphics,Scroll,System,Real Time,我目前正在编写一个应用程序,它应该以滚动方式显示实时测量曲线(想想心电图记录器或示波器)。UI线程中的意外系统调用会使显示中断 数据通过蓝牙传输。所有的工作都很好,显示屏滚动相当平稳,平均更新速度为26帧/秒。但是,尽管如此,显示器还是令人目瞪口呆 我使用traceview获得更多的洞察力,根据traceview,口吃是调用android/view/ViewRoot.handleMessage的结果,平均每次调用持续131毫秒。 如果我在traceview中进一步挖掘,这些周期将在android

我目前正在编写一个应用程序,它应该以滚动方式显示实时测量曲线(想想心电图记录器或示波器)。UI线程中的意外系统调用会使显示中断

数据通过蓝牙传输。所有的工作都很好,显示屏滚动相当平稳,平均更新速度为26帧/秒。但是,尽管如此,显示器还是令人目瞪口呆

我使用traceview获得更多的洞察力,根据traceview,口吃是调用
android/view/ViewRoot.handleMessage
的结果,平均每次调用持续131毫秒。 如果我在traceview中进一步挖掘,这些周期将在android/view/ViewRoot.performTraversals中烧毁。92%的CPU周期被消耗在对android/view/view.measure的递归调用中

由于递归调用结构的存在,它变得复杂起来。但是我可以找到对LinearLayout、FrameLayout和RelativeLayout的onMeasure()方法的调用。每种布局类型的onMeasure()方法消耗的CPU周期大致相同。这很奇怪,因为在我的活动中,我只使用了一个简单的线性布局,只有2个元素。 我只是看不出为什么一个包含2个元素的LinearLayout的假定重新布局会调用未使用的布局,并且需要高达131毫秒的时间

进一步资料:

  • 平台HTC desire HD和Android 2.3.1
  • 我使用处理程序在UI线程中执行绘图
  • 该布局是一个简单的线性布局,包含两个元素:自定义视图和文本字段
  • 状态栏用
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_全屏、WindowManager.LayoutParams.FLAG_全屏)隐藏
  • 在每个新数据块上执行绘图,大约每50毫秒一次
  • 图形本身使用画布,其性能足以跟上传入的数据
经过长时间的解释,以下是问题:

  • 什么叫android/view/ViewRoot.handleMessage?(每850毫秒的呼叫间隔相对相等,并且与我的活动的任何活动都没有明显的链接(没有直接呼叫、呼叫数量和相对位置未链接到用于绘制的消息处理程序)
  • 如何抑制对android/view/ViewRoot.handleMessage的调用,或者如何加快调用速度(我的LinearLayout中只有2个元素)
  • 调用未使用的布局首先让我想到状态栏或一些隐藏的活动(例如主屏幕),它们可能会使用这些布局。但是为什么这些电话是我活动轨迹的一部分呢?据我所知,跟踪应该只跟踪活动进程。e、 g.生成实时数据的my service调用不是跟踪的一部分
  • 是否有可能跟踪某些系统组件的个别调用?当我放大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.PerformTravels()
  • 非主题:是否有可能导出traceview(父母、孩子CPU时间等)中显示的数据,而不是屏幕截图

  • 好的,我找到了长时间调用android/view/ViewRoot.handleMessage的原因。 这确实是我的申请造成的

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

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

    这个问题现在已经解决了。显示滚动现在相当平滑

    谢谢你的耐心。希望它对在stackoverflow上偶然发现此线程的任何人都有用

    杰波