gpt4 book ai didi

android - 意外的android系统调用使滚动图形卡顿的流畅显示

转载 作者:太空宇宙 更新时间:2023-11-03 13:02:59 25 4
gpt4 key购买 nike

我目前正在编写一个应以滚动方式显示实时测量曲线的应用程序(想想 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 周期。这很奇怪,因为在我的 Activity 中我只使用了一个只有 2 个元素的简单 LinearLayout。我只是看不出为什么一个假设的 LinearLayout 与 2 个元素的重新布局执行对未使用的布局的调用并且需要高达 131 毫秒的时间来执行此操作。

更多信息:

  • 平台 HTC desire HD with Android 2.3.1。
  • 我使用处理程序在 UI 线程中执行绘图。
  • 布局是一个简单的 LinearLayout,包含 2 个元素:一个自定义 View 和一个文本字段。
  • 状态栏隐藏getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); .
  • 绘制是在每个新数据 block 上执行的,大约到达。每 50 毫秒一次。
  • 绘图本身使用 Canvas ,并且性能足以跟上传入的数据。

在解释了那么长之后,下面是问题:

  1. 什么叫android/view/ViewRoot.handleMessage? (调用相对每 850 毫秒间隔相等,并且与我的 Activity 的任何 Activity 没有明显的链接(没有直接调用,调用次数和相对位置未链接到消息处理程序以进行绘图)
  2. 如何抑制对 android/view/ViewRoot.handleMessage 的调用或如何使它们更快(我的 LinearLayout 中只有 2 个元素)
  3. 调用未使用的布局首先让我想到了状态栏或一些隐藏的 Activity (例如主屏幕),它们可能会使用此类布局。但这些电话怎么会是我 Activity 痕迹的一部分呢?据我了解,跟踪应该只跟踪 Activity 进程。例如生成实时数据的我的服务的调用不在跟踪的一部分。
  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 中显示的数据(父子-CPU 时间等)?

最佳答案

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

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

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

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

感谢您的耐心等待。可能对在 stackoverflow 上偶然发现此线程的任何人有用。

杰普

关于android - 意外的android系统调用使滚动图形卡顿的流畅显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8340766/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com