2014-03-06 107 views
1

我有一个奇怪的(和令人沮丧的)在我的游戏中的问题。没有OutOfMemoryError,但无法加载图像

游戏本身是画在画布上的,所以我没有使用布局和其他本地元素。只是一个画布的根布局。我实施了AdMob和Analytics,但它已停用(并未分配)进行测试。

几个级别后,我无法加载一些图像。 LogCat只输出imageref_ashmem create failed <(null)> *number of bytes*,但没有OutOfMemoryError

我试过内存分析工具(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

Android的重新调整,从绘制文件夹的图像在不同的分辨率工作。而这个调整大小可能会搞乱你的图片加载。

为了解决这个问题,我建议你复制引起问题的图像到所有文件夹drawable-ldpi,mdpi,hdpi,xhdpi,xxhdpi并运行你的测试。它应该工作。

副作用

:更大的APK大小

:图片加载速度更快,具有非常少的内存使用情况。再次运行上面的DDMS堆东西,您会注意到内存使用量显着下降。

+0

感谢您的回答!所有游戏图形都在资产文件夹中。可绘制文件夹中只有6个更大的图像。我支持mdpi,hdpi,xhdpi,xxhdpi,所以我认为这个系统并没有调整它们的大小。 – RichX

+0

我无法理解你的问题。 – Siddharth