Android在创建硬件层慢的原因分析

本文分析了一个项目中遇到的应用滑动时出现卡顿的问题。通过systrace和GL Trace工具定位到OpenGLES的glTexImage2D函数在高分辨率下进行大内存复制时产生性能瓶颈,并最终通过调整kernel配置解决了该问题。
部署运行你感兴趣的模型镜像

      最近在项目上,发现很多应用在开始滑动的时候,都会卡顿一下,看了一下systrace文件,可以看到在buildLayer的时候耗时比较长:

      到是在glTexImage2D耗时比较多。进一步使用GL Trace分析,可以看到:

glTexImage2D(target = GL_TEXTURE_2D, level = 0, internalformat = 6408, width = 1024, height = 1536, border = 0, format = GL_RGBA, type = GL_UNSIGNED_BYTE, pixels = []) 

Wall time: 15, 911, 458 ns 

Thread time: 13, 418, 698 ns 

glEndTilingQCOM(preserveMask = 1) 

Wall time: 183, 106 ns 

Thread time: 183, 105 ns 

可以看到Open GL ES在draw的时候,耗时异常。

         对比以前的平台:

glTexImage2D(target = GL_TEXTURE_2D, level = 0, internalformat = 6408, width = 1024, height = 1536, border = 0, format = GL_RGBA, type = GL_UNSIGNED_BYTE, pixels = []) 

Wall time: 1, 708, 984 ns 

Thread time: 1, 708, 984 ns 


glEndTilingQCOM(preserveMask = 1) 

Wall time: 7, 468, 021 ns 

Thread time: 4, 963, 803 ns 


在draw TexImage的时候,是多么的简洁干练呀!

同事通过跟踪glTexImage2D可以看到,这个时候是因为有大的内存copy操作,因为屏幕分辨率很大,而且有一张大的图片,导致有一个10.5M的内存拷贝操作,而这个操作时很耗时的。

        我们跟踪了很多天,芯片厂商也跟踪了很多天,至少有一个月左右的时间吧!问题依然毫无进展,痛苦呀!

        突然有一天,问题由所好转了!这是怎么一回事呀?上帝真好!于是呼我折腾了一天,回退了一下版本,发现一个修改kernel的config文件的版本把这个问题改好了!

         来回折腾以后,发现config文件都用错了!这让我情何以堪呀!当时我读到Sun的Dtrace的开发人员找到,是因为把服务器配置成了路由器,引发出性能问题,从而萌发出开发Dtrace的时候,我觉得Sun的人很“傻”!我现在觉得我们也聪明不到哪去,而且还在走别人10多年前的老路!至少别人开发了Dtrace,我确无动于衷!人生最大的悲哀莫过于此!

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

### Android ScrollView 性能优化:创建的原因及解决方案 #### 1. 创建的原因 ScrollView 的性能问题通常与以下因素相关: - **布局嵌套过深**:如果 ScrollView 内部的子视图层级过于复杂,Android 在测量和绘制时会消耗更多时间[^2]。 - **过度绘制**:当 ScrollView 中的子视图存在重叠或半透明区域时,系统会重复绘制这些区域,导致性能下降。 - **背景色设置过多**:每个 View 都单独设置背景色会导致 Android 上的过度绘制问题,尤其是在 ScrollView 这种需要频繁滚动和刷新的组件中[^2]。 - **复杂的自定义视图**:如果 ScrollView 中包含大量自定义视图,且这些视图的 `onDraw` 或 `onMeasure` 方法实现效率低下,则会显著影响性能。 #### 2. 解决方案 以下是针对上述问题的具体优化措施: - **减少布局嵌套** 尽量简化 ScrollView 的布局结构,避免不必要的嵌套。例如,可以使用 `ConstraintLayout` 替代传统的 `LinearLayout` 或 `RelativeLayout`,从而减少布局层次[^3]。 - **避免过度绘制** 检查 ScrollView 及其子视图是否存在背景色重叠的情况。可以通过 Android 的开发者选项中的“显示过度绘制”功能来检测,并移除多余的背景设置[^2]。 - **优化子视图的绘制** 如果 ScrollView 包含大量静态内容,可以考虑将这些内容合并为一张图片,以减少绘制操作。此外,确保子视图的 `onDraw` 和 `onMeasure` 方法实现高效[^2]。 - **启用硬件加速** 确保应用启用了硬件加速(Hardware Acceleration),这可以显著提升图形渲染性能。可以在 `AndroidManifest.xml` 中全局启用硬件加速,或者针对特定 Activity 启用: ```xml <application android:hardwareAccelerated="true" /> ``` - **使用 RecyclerView 替代 ScrollView** 如果 ScrollView 中的内容是动态生成的列表,建议使用 `RecyclerView` 替代。`RecyclerView` 的回收复用机制能够显著提高性能[^1]。 - **启用 Hermes 引擎(适用于 React Native 项目)** 对于基于 React Native 的项目,启用 Hermes JavaScript 引擎可以加快应用启动速度并降低内存占用,间接改善 ScrollView 的性能[^4]。 #### 示例代码:优化 ScrollView 布局 以下是一个简化的 ScrollView 布局示例,使用 `ConstraintLayout` 减少嵌套: ```xml <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/text1" android:layout_width="0dp" android:layout_height="wrap_content" android:text="Text 1" app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" /> <TextView android:id="@+id/text2" android:layout_width="0dp" android:layout_height="wrap_content" android:text="Text 2" app:layout_constraintTop_toBottomOf="@id/text1" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> </ScrollView> ``` #### 注意事项 在进行性能优化时,应结合实际场景选择合适的优化策略。例如,对于静态内容较多的界面,减少布局嵌套和避免过度绘制尤为重要;而对于动态内容较多的界面,可能需要引入更高效的组件(如 `RecyclerView`)。 ---
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值