Android系统有一个与其他操作系统不相同之处,常见的操作系统如Windows操作系统,其主界面是系统核心的一部分不可以被替换,Android的主界面则是一个“应用程序”,名称为Launcher.apk,可以被其他软件厂商开发的界面程序替代。在使用Android系统过程中,发现加入Copybit硬件适配技术的Android主界面,在换用一款称之为LauncherPro的商业系统主界面应用程序时,可获得更为流畅的用户体验。
为了解释这个问题,本文对系统从启动到主界面解锁的整个过程中,Gralloc模块分配的显示内存数据进行了统计,发现了一些线索,统计结果见表1和表2。
表1 Android默认界面系统启动显存分配记录
次数 尺寸 格式 单次分配
(Byte) 总消耗内存(Byte)
1 800x480 RGB565 770048 77048
2 800x480 RGB565 770048 1540096
3 800x455 RGBA8888 1458176 2998272
4 800x25 RGB565 40960 3039232
5 800x455 4497408 1458176 4497408
6 480x76 RGBA8888 147456 4644864
7 480x76 RGBA8888 147456 4792320
8 480x76 RGBA8888 147456 4939776
9 800x480 RGB565 770048 5709824
10 800x480 RGB565 770048 6479872
11 800x480 RGB565 770048 7249920
12 800x480 RGB565 -770048 6479872
13 800x480 RGB565 770048 7249920
14 800x480 RGB565 -770048 6479872
15 800x480 RGBA8888 1536000 8015872
16 800x480 RGB565 -770048 7245824
17 800x480 RGB565 -770048 6475776
18 800x480 RGBA8888 1536000 8011776
19 800x480 RGBA8888 1536000 9547776
20 480x141 RGBA8888 274432 9822208
21 800x480 RGBA8888 -1536000 8286208
22 480x76 RGBA8888 -147456 8138752
23 800x25 RGB565 40960 8179712
24 480x141 RGBA8888 274432 8454144
25 480x76 RGBA8888 -147456 8306688
26 800x25 RGB565 40960 8347648
27 800x25 RGB565 40960 8388608
28 800x480 RGBA8888 1536000 9924608
29 800x480 RGBA8888 -1536000 8388608
30 800x455 RGBA8888 -1458176 6930432
31 800x455 RGBA8888 -1458176 5472256
表2 LauncherPro界面系统启动显存分配记录
次数 尺寸 格式 单次分配(Byte) 总消耗内存(Byte)
1 800x480 RGB565 770048 77048
2 800x480 RGB565 770048 1540096
3 800x455 RGBA8888 1458176 2998272
5 800x455 RGBA8888 1458176 4456448
4 800x25 RGB565 40960 4497408
6 800x455 RGBA8888 1458176 5955584
7 800x455 RGBA8888 -1458176 4497408
8 800x455 RGBA8888 1458176 5955584
9 480x76 RGBA8888 147456 6103040
10 480x76 RGBA8888 147456 6250496
11 800x455 RGBA8888 -1458176 4792320
12 800x480 RGB565 770048 5562368
13 800x480 RGB565 770048 6332416
14 800x480 RGB565 770048 7102464
15 800x480 RGB565 -770048 6332416
16 480x76 RGBA8888 147456 6479872
17 480x76 RGBA8888 -147456 6332416
18 800x480 RGB565 770048 7102464
19 800x480 RGB565 -770048 6332416
20 800x480 RGB565 -770048 5562368
21 800x480 RGB565 770048 6332416
22 800x480 RGB565 770048 7102464
23 480x141 RGBA8888 274432 7376896
24 800x480 RGB565 -770048 6606848
25 480x76 RGBA8888 -147456 6459392
26 800x25 RGB565 40960 6500352
27 480x141 RGBA8888 274432 6774784
28 800x25 RGB565 40960 6815744
29 480x76 RGBA8888 -147456 6668288
30 800x25 RGB565 -40960 6627328
31 800x455 RGBA8888 -1458176 5169152
32 800x455 RGBA8888 -1458176 3710976
图中横轴为内存分配或释放的次数,纵轴为内存使用量,其中深色数据为系统使用的总显存数量,浅色数据为每一次系统分配或释放的显存数量。图4-12为使用系统默认Launcher界面的内存分配情况,系统启动时最多占用约10MB显存,考虑到已分配内存之间的空隙,实际占用系统内存会稍大,系统完全启动后使用的显存约5.5MB。图4-13为使用LauncherPro界面的内存分配情况,系统启动时最多占用约7.5MB显存,系统完全启动后使用的显存约3.8MB,比使用Launcher节省1.7MB。
LauncherPro比Launcher节省的内存主要体现在分配图层的类型上。表4-8的第18和19次内存分配,分配了两块RGBA8888的图层,两块共占用显存3MB,供Launcher使用。表4-8的第21和22次内存分配,分配了两块RGB565的图层,两块共占用1.5MB显存,供LauncherPro使用。图层类型的不同,除了明显表现为节省显存外,还有一个巨大的好处,在进行图形混合操作时不需要进行颜色格式的转换。
图层混合计算过程可以利用硬件加速单元提升处理速度,这就是是Copybit硬件加速模块提升系统主界面性能的原因。但是LauncherPro软件通过避免使用RGBA8888图层,预先处理好数据,减少图层显示时的计算量,对于系统主界面这种需要频繁使用的应用,或许是一个更好的选择。
应用软件设计优化思路可归纳如下:
应用软件在频繁调用的场合尽量不要申请RGBA8888类型图层,避免占用系统资源和处理器的处理能力。
可以预先计算的显示资源应当尽量提前处理,避免在显示前一刻才进行计算。