意外的android系统调用使滚动图形的显示变得流畅
我目前正在编写一个应用程序,它应该以滚动方式显示实时测量曲线(想想心电图记录器或示波器)。UI线程中的意外系统调用会使显示中断 数据通过蓝牙传输。所有的工作都很好,显示屏滚动相当平稳,平均更新速度为26帧/秒。但是,尽管如此,显示器还是令人目瞪口呆 我使用traceview获得更多的洞察力,根据traceview,口吃是调用意外的android系统调用使滚动图形的显示变得流畅,android,graphics,scroll,system,real-time,Android,Graphics,Scroll,System,Real Time,我目前正在编写一个应用程序,它应该以滚动方式显示实时测量曲线(想想心电图记录器或示波器)。UI线程中的意外系统调用会使显示中断 数据通过蓝牙传输。所有的工作都很好,显示屏滚动相当平稳,平均更新速度为26帧/秒。但是,尽管如此,显示器还是令人目瞪口呆 我使用traceview获得更多的洞察力,根据traceview,口吃是调用android/view/ViewRoot.handleMessage的结果,平均每次调用持续131毫秒。 如果我在traceview中进一步挖掘,这些周期将在android
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毫秒一次
- 图形本身使用画布,其性能足以跟上传入的数据
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()
好的,我找到了长时间调用android/view/ViewRoot.handleMessage的原因。 这确实是我的申请造成的 我的应用程序有两个屏幕(活动),一个是状态信息的复杂布局,另一个是输入数据的实时显示 通过蓝牙输入的数据包含混合的实时数据和状态数据。当我切换到实时活动时,我正在使用
finish()停止状态活动代码>启动新的实时活动后。不幸的是,这还不足以停止消息处理程序,它在UI线程中接收新的状态信息,并继续更新不可见和已完成活动中的状态数据。此活动的重新发布导致实时数据断断续续
这个问题现在已经解决了。显示滚动现在相当平滑
谢谢你的耐心。希望它对在stackoverflow上偶然发现此线程的任何人都有用
杰波