gpt4 book ai didi

java - 如何提高 resources.getDrawable 的性能

转载 作者:行者123 更新时间:2023-12-02 06:01:59 25 4
gpt4 key购买 nike

我有一个加载三个 png 图像的 Activity 。在 hdpi 上,它们分别是 20kb、148kb 和 190kb。这是我加载它们的代码:

Drawable bronzePlaque = resources.getDrawable(R.drawable.bronze_plaque);
Drawable silverPlaque = resources.getDrawable(R.drawable.silver_plaque);
Drawable goldPlaque = resources.getDrawable(R.drawable.gold_plaque);

仅这些调用似乎就需要大约 500 毫秒,这会导致加载该 Activity 时出现明显的延迟。

我不确定花费多少时间是由于图片的大小与垃圾收集/堆大小的增长有关,但我想尝试做一些事情来改进它。有没有办法让虚拟机正确增长堆,并且对于这三个分配仅进行一次垃圾收集?

这是这三行的 logcat 输出(以及围绕它们的系统打印 getTimeInMillis)。

03-23 14:05:57.260: I/System.out(30302): time: 1395608757267
03-23 14:05:57.370: D/dalvikvm(30302): GC_FOR_ALLOC freed 39K, 4% free 7990K/8272K, paused 20ms, total 20ms
03-23 14:05:57.370: I/dalvikvm-heap(30302): Grow heap (frag case) to 8.968MB for 1188160-byte allocation
03-23 14:05:57.390: D/dalvikvm(30302): GC_FOR_ALLOC freed 1K, 4% free 9149K/9436K, paused 19ms, total 19ms
03-23 14:05:57.540: D/dalvikvm(30302): GC_FOR_ALLOC freed 1K, 4% free 9148K/9436K, paused 15ms, total 16ms
03-23 14:05:57.540: I/dalvikvm-heap(30302): Grow heap (frag case) to 10.245MB for 1340008-byte allocation
03-23 14:05:57.560: D/dalvikvm(30302): GC_FOR_ALLOC freed <1K, 3% free 10457K/10748K, paused 19ms, total 19ms
03-23 14:05:57.720: D/dalvikvm(30302): GC_FOR_ALLOC freed <1K, 3% free 10457K/10748K, paused 15ms, total 15ms
03-23 14:05:57.720: I/dalvikvm-heap(30302): Grow heap (frag case) to 11.482MB for 1297384-byte allocation
03-23 14:05:57.740: D/dalvikvm(30302): GC_FOR_ALLOC freed <1K, 3% free 11724K/12016K, paused 18ms, total 18ms
03-23 14:05:57.760: I/System.out(30302): time: 1395608757770

我知道,在加载该 Activity 后,稍后加载该 Activity 会更快。我是否应该在应用程序加载时加载这些图像一次,以帮助防止痛苦的堆增长/垃圾收集?我宁愿预先加载半秒的延迟,也不愿在单击 Activity 时体验到延迟。

最佳答案

尝试从另一个线程(即非主线程)加载这些图像。除了大约 100 毫秒花费在 gc 上之外,其余 500 毫秒用于从文件系统加载数据并将 JPG 数据解压缩为位图。

I know that after that activity has been loaded once it's much faster loading the activity later. Should I maybe load those images once at app load time to help prevent painful heap growing / garbage collecting?

除非您故意保留已解码的位图,否则资源可以自由释放它认为合适的任何缓存的可绘制/位图。请注意,这些图像将占用 750x502x4 + 750x567x4 + 750x549x4 =~4.5 MB RAM,故意保留它们可能会产生其他影响,例如旧设备上的 OoM(Nexus One 每个进程/应用程序最多只有 16 MB RAM),并且可能导致您的应用程序在后台运行且操作系统需要更多 RAM 时更快地从内存中逐出。

关于java - 如何提高 resources.getDrawable 的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22597188/

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