我的游戏中有一个奇怪的(令人沮丧的)问题。
游戏本身是用画布绘制的,所以我没有使用布局和其他原生元素。只有一个画布的根布局。我已经实施了AdMob和Analytics,但它已被禁用(而不是分配)用于测试。
在几个级别后,我无法加载一些图像。 LogCat只输出imageref_ashmem create failed <(null)> *number of bytes*
,但不输出OutOfMemoryError
。
我尝试过Memory Analyzer Tool(MAT),但没有运气。第一级后的保留大小(最大)为10.6 MB,停止加载图像之前的一级是10.7 MB(有时更少)。这种情况在仿真器和实际设备中是相同的(具有不同的值)。 在第一级和最后一级拍摄的HPROF文件的比较显示非常小的差异(~2kB)。
DDMS堆中的相同内容。当事情失败时,我有70.30%的已用内存。垃圾收集器也显示27%的可用内存。这是LogCat中的输出:
GC_CONCURRENT freed 193K, 42% free 6680K/11363K, paused 2ms+2ms
D/dalvikvm(16011): GC_CONCURRENT freed 118K, 27% free 8396K/11363K, paused 2ms+2ms
D/skia(16011): ------- imageref_ashmem create failed <(null)> 143360
D/skia(16011): ------- imageref_ashmem create failed <(null)> 1155072
D/skia(16011): ------- imageref_ashmem create failed <(null)> 450560
D/skia(16011): ------- imageref_ashmem create failed <(null)> 143360
D/skia(16011): ------- imageref_ashmem create failed <(null)> 36864
D/skia(16011): ------- imageref_ashmem create failed <(null)> 40960
另一个奇怪的事情是,当我将Debug.getNativeHeapAllocatedSize()
输出到控制台时,水平之后它总是更大(~0.7 MB增量)。但MAT没有显示出内存使用量的任何增长。这种行为发生在2个不同的真实设备上。
我认为我的内存泄漏很大。但MAT没有显示出任何增长,并且OutOfMemoryError没有抛出。 所以我不知道在哪里查看泄漏/分配等。
修改
也许我没有正确使用MAT,所以如果有人感兴趣,这里有2个hprof文件。一个是在记忆问题之前的第一个运行和第二个级别。
link to zip file
仅为了安全
MD5 8f4ef3eeb28c1d129ac0c0ef01cc8583
SHA-1 0afc1cc06527225ad3029ef2bb4ebc5fe12d02a2
答案 0 :(得分:0)
Android调整可绘制文件夹中的图像以适应不同的分辨率。这个调整大小会搞乱你的图像加载。
要解决此问题,我建议您将图像(导致问题)复制到所有文件夹drawable-ldpi,mdpi,hdpi,xhdpi,xxhdpi并运行测试。它应该工作。
副作用
否定:更大的APK尺寸
肯定:图片加载速度更快,内存使用量更少。再次运行上面的DDMS堆,您会注意到内存使用量的显着下降。