【发布时间】:2014-10-06 08:10:12
【问题描述】:
所以我在这里真的很困惑。与我合作的设计师希望为 Android 平板电脑提供高质量的图像(png 文件),但游戏也为功能较弱的设备提供了较小的图像。我认为堆上的内存量将是确定要使用哪组图像的指标,使用Runtime.getRuntime().maxMemory() - Runtime.getRuntime().totalMemory()。不过,情况似乎并非如此。在 BlueStacks 上,它可以很好地加载高质量的图像,它有大约 40,000,000 字节。设计师的 Galaxy Nexus 为一些较大的图像设置了黑匣子(我理解这是因为加载图像的内存不足),但他的 Galaxy Nexus 有大约 50,000,000 个可用字节,甚至比 BlueStacks 还要多。
那么限制因素是什么?还有一个相关的问题是,为什么有些手机游戏具有令人印象深刻的视觉质量,但我却无法加载一些图像?我做错了什么?
请注意,我使用的是 AndEngine,下面是我如何加载图像的示例。
BuildableBitmapTextureAtlas resetTA = new BuildableBitmapTextureAtlas(this.getTextureManager(), 310 / d, 190 / d,
TextureOptions.BILINEAR);
resetTR = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(resetTA, this, "gfx/" + lowres + "reset.png", 1, 1);
try
{
resetTA.build(new BlackPawnTextureAtlasBuilder<IBitmapTextureAtlasSource, BitmapTextureAtlas>(0, 0, 0));
resetTA.load();
}
catch (TextureAtlasBuilderException e)
{
Debug.e(e);
}
Galaxy Nexus 中未加载的图像之一是 2320x464 的 sprite sheet png 文件。
【问题讨论】:
-
您想要的文件大约是 4MB 的堆空间,并且可能没有一个 4MB 的空间块:commonsware.com/blog/2014/06/16/art-garbage-collection.html
-
一般来说,您应该考虑到您的内存非常有限,并以这种方式编写您的代码。许多设备根本没有内存,即使是中型 PC 也可能包含。每个应用程序都与其他应用程序和 Android 本身共享内存。我认为监控运行时内存不会给你太多帮助。加载时,您需要确保有良好的样本大小——当它只进入缩略图大小的视图时,读取 4MB 的图像是没有意义的。在此处阅读 Android 指南中的高效位图以获取真实信息 - developer.android.com/training/displaying-bitmaps/index.html
-
过去我在 AndEngine 中遇到过不是 2^n 尺寸的大图像的问题。不确定这在以后的版本中是否仍然是一个问题,因为我几个月没有使用 AndEngine。
-
您还应该考虑比例和投影等因素。如果只是将其投射到远处,则无需加载高质量的图像,图像质量的下降不会很明显。仅在任何给定时刻加载您需要的确切尺寸是最佳的。