首页天道酬勤安卓性能优化,深度影响完结.apk

安卓性能优化,深度影响完结.apk

张世龙 05-12 06:33 22次浏览

这篇文章是安卓性能优化模型-第一季的读书笔记。 Android性能优化模型主要介绍了Android的渲染机制、内存和GC以及功耗优化方面的内容。 内容庞杂,也有难以理解的知识点,阅读时请顺便记录下自己的理解。

笔记条目

1、安卓系统每16ms输出VSYNC信号,触发硬件渲染UI。

2、1秒=1000ms,因此根据上述规则,UI必须每秒渲染1000/16=60次。 也就是说,我们经常看到的60hz值表示每秒刷新屏幕的次数。 这在术语中称为“刷新率”。

3、刷新率这个值取决于硬件的固定参数,一般这个值是60fps。 这是因为人眼和大脑无法感知到60fps以上的界面更新。

4、帧率是区别于刷新率的另一个概念。 他表示每秒的GPU描绘操作的帧数Note: 两者的区别在于刷新率意味着屏幕将以此频率不断刷新屏幕,对于屏幕上显示的内容他无法控制。 帧率代表GPU (图形处理器)每秒钟绘制的次数,他们负责以刷新率不断刷新屏幕,而后者以帧率绘制接口。

5、要在屏幕上显示视图内容,必须结合刷新率和帧速率。

6、GPU获取图形数据绘制,硬件取出GPU生成的视图数据显示在画面上。 这个过程多次发生在我们的手机上。

如果屏幕刷新率和GPU的帧速率匹配,那一定很棒。 GPU每特定时间准备一次可视数据。 然后相应地

,因为屏幕的刷新率与帧速率匹配,所以此时正好屏幕也会刷新界面,视图会正常显示。

但是,在很多情况下,他们俩的步调可能不一致,所以会产生偏差

此时,GPU侧准备了数据,但画面侧缺失,无法立即显示。

7、界面渲染双缓冲技术

一般来说,我们在绘制UI时,会采用一种叫做“双缓冲区”的技术。 双缓冲区是指使用SharedBufferStack中的两个缓冲区,一个称为前缓冲区,另一个称为后缓冲区。 UI始终在后台缓冲器中绘制,然后更换前端缓冲器以在显示设备上渲染。 理想情况下,此类刷新可以在16ms内完成(60FPS )。

8、每次View的绘制内容发生变化时,重新创建显示列表、渲染显示列表

9、安卓的内存模型分为三个阶段。 这里的存储器应该指堆存储器。 分别是YoungGeneration、OldGeneration、Permanent (常驻) Generation。 也就是说,如果Android虚拟机的堆内存为125M,则此1225m他可以为每个块设置变量,以指示此块属于哪个级别。 这是个人的猜测,说这么多,为了说明一个事实,安卓积累内存的领域分为三种不同类型: Young、Old、Permanent。

这里每个区域一定有具体的大小值。 具体大小的分配是指JVM。 Old区域、Permanent区域的大小比Young区域大。

10、内存区域排名的含义,请不要看官方介绍。 个人推测也表明,这样做是更好地利用内存空间的这么宝贵的地方。 分成不同的区域后,我们每次都是新的

毫无疑问,对于新对象,分配新对象的空间必须位于YoungGenration内存区域中。

11、应该谈谈垃圾回收。 当我们的程序不断运行、不断创建对象、Young区域中的空间总是用完时,JVM会检测到内存空间不足,然后启动GC执行垃圾回收。 此时,他应该判断Young区域的一些值,看看他们是否经常使用,如果是,则将该部分的内存空间标记为Old。 同样,Old区域中的对象也可能移动到Permanent中。 也就是说,JVM的目的是提高对象创建的效率。

垃圾回收清除Young区无用的对象。

12、对于上述猜测,这里是胡凯博文中的原话,对比理解:

一些Android具有三级生成内存模型,最近分配的对象存储在YoungGeneration区域中。 在此区域停留的时间达到一定程度后,将移动到OldGeneration,最后移动到PermanentGeneration区域。

每一级内存区域都有一定的大小,然后不断将新对象分配给该区域,当这些对象的总大小快要达到该级内存区域的阈值时,将触发GC操作以存储其他新对象

13、内存泄漏问题。 胡凯博文写得很清楚,就照搬胡凯的原文

内存泄漏意味着GC无法识别程序不再使用的对象,导致该对象保留在内存中,从而消耗宝贵的内存空间。 很明显,这将减少各级Generation的内存空间,使GC更容易启动,并导致性能问题。

上面的话直接指出了内存泄漏为什么会引起性能问题。 因为泄露的对象堆积在内存区域

,随着泄露的对象越来越多,JVM 周期性的 GC 后发现内存空间依旧满满的,此时就会发生大家常说的内存溢出问题了。

其实垃圾回收器(GC)在很努力的回收内存区中的无用对象,但是每次扫描却发现 那些泄露的对象一直被一些或者的对象所持有,所以内存泄露问题,一定在开发中需要重视。

14、每次 GC 的时候,其他所有线程都是暂停状态,也就是说 GC操作会暂停其他任务。

开发 Tip

以上是自己在阅读《Android性能优化典范》时的笔记,感谢作者可以把视频内容转化为更加容易理解的文章。

但是任何好文章,阅读完应该可以给读者一些指导,这篇文章中讲了很多概念以及原理,下面就针对文章,总结一些开发过程中应该遵循的一些建议,以期让自己的 App 具有更好的性能。

1、避免在 for 循环中给对象分配内存,直白一点就是说 不要在 for 循环中 new 对象,最好可以移动到 for 之前。

2、避免在自定义 View 时,在 onDraw 方法中执行太复杂的逻辑操作。

3、避免在 onDraw 方法中 创建对象,因为在界面绘制时,该方法可能会被大量的重复执行,这样会导致一瞬间产生大量的对象,从而导致堆空间中瞬间产生大量无用对象,从而触发 JVM 的 GC 操作。Note:一些情况下,无法避免在 onDraw 方法中创建对象,那么此时为了优化性能,可以采取对象池的策略,手动缓存已创建的对象,并加以复用,从而降低性能损失。但是使用此方法,需要注意一点,应该及时的手动清理对象池,否则可能会引起更加严重的内存问题。

4、开发app的性能目标就是保持60fps,这意味着每一帧你只有16ms=1000/60的时间来处理所有的任务。所以我们的布局能简单则简单。

5、考虑到过渡绘制,我们在写布局 layout 时,不应该随意的去为一些 View 设置 background,例如,当我们的根布局已经设置过一次背景色,那么子view默认的背景色就是它了,所以对于一些子 View ,如果它跟根布局背景颜色一致,那么该 View 就无需再设置背景色了,另外一些情况可能需要设置 selector,此时默认背景可以设置为 透明色。

6、对于电量优化,我们应该减少唤醒屏幕的次数以及持续时间,使用 WeakLock 处理唤醒问题。

7、对一些非必须马上执行的操作,可以等待手机处于充电状态或者电量充足时再执行。

8、对一些零散的网络请求,可以打包一次操作,避免过多的无线信号引起的电量消耗。

华为mate30怎么释放内存,安卓性能优化