我有一个奇怪的(和令人沮丧的)在我的游戏中的问题。没有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
感谢您的回答!所有游戏图形都在资产文件夹中。可绘制文件夹中只有6个更大的图像。我支持mdpi,hdpi,xhdpi,xxhdpi,所以我认为这个系统并没有调整它们的大小。 – RichX
我无法理解你的问题。 – Siddharth