位图太大 - 内存不足?

时间:2012-07-29 03:18:31

标签: java android

我正试图在我的设备上制作一个人的某些动作。我创建了一个精灵表,最终为1.23Mb。图像尺寸为5000 x 1500像素。工作表有8行,每行都是自己的动作。 (继续,鞠躬,跳......)。最长的动作是32张图像。所以图像基本上是32列,共8行。所以,现在我加载它:

我一做到这一点:

private Bitmap bmp;
bmp = BitmapFactory.decodeResource(getResources(), R.drawable.myImage);

我收到错误:

  

线程[< 1> main](暂停(异常OutOfMemoryError))
    BitmapFactory.decodeResource(Resources,int,BitmapFactory $ Options)   line:385 BitmapFactory.decodeResource(Resources,int)line:404
    GameView。(上下文)行:25 FightActivity.onCreate(Bundle)   line:13 FightActivity(Activity).performCreate(Bundle)line:4465
    Instrumentation.callActivityOnCreate(Activity,Bundle)行:1049
    ActivityThread.performLaunchActivity(ActivityThread $ ActivityClientRecord,   意图)行:1920
    ActivityThread.handleLaunchActivity(ActivityThread $ ActivityClientRecord,   意图)行:1981 ActivityThread.access $ 600(ActivityThread,   ActivityThread $ ActivityClientRecord,Intent)line:123
    ActivityThread $ H.handleMessage(消息)行:1147
    ActivityThread $ H(Handler).dispatchMessage(Message)行:99     Looper.loop()行:137 ActivityThread.main(String [])行:4424
    Method.invokeNative(Object,Object [],Class,Class [],Class,int,   boolean)line:not available [native method] Method.invoke(Object,   对象...)行:511 ZygoteInit $ MethodAndArgsCaller.run()行:784
    ZygoteInit.main(String [])行:551 NativeStart.main(String [])   line:not available [native method]

我是否仅限于某个文件大小?好像很奇怪?如果是这样,我唯一的选择是将精灵分割成单独的“动作”图像,而不是在一个大的精灵表中每行动作图像序列?

希望有人可以帮助新手。

4 个答案:

答案 0 :(得分:1)

简单的计算可​​以为您提供答案。假设每像素32位,你有((5000x1500)像素)*(每像素32位)/(每字节8位)/(每Mb 1024 * 1024位)= 28MB。

我进行了谷歌搜索,我看到不同版本的Android和不同手机的默认堆大小从16MB到32MB不等。我想我看到最常见的24MB。因此,您的图像很可能只是内存不足。查看此帖子,了解您的堆大小:https://stackoverflow.com/a/9428660/1448071

编辑:似乎没有一种方法可以增加Android的VM堆大小。有一个VMRuntime.getRuntime()函数,其中包含一个setMinimumHeapSize函数Android: how to increase heap size at runtime?。但它似乎被弃用了。我建议你拆分你的精灵。

答案 1 :(得分:1)

为角色中的每个动画制作一个spritesheet,保留对常见动画的引用,并根据需要加载。这很灵活,你的动画不会滞后,除非你需要从内存加载位图更改,例如当你从运行变为空闲或其他东西时(虽然这两个很常见,你可以把它们保存在记忆很久了。)

增加VM堆大小只是部分解决方案,如果您将位图保持得如此之大,许多设备将无法获得所需的堆大小。就像他们上面说的那样,磁盘上的图像文件大小对于在Google Play上部署应用程序非常重要(用户可以下载更少)但是在ram上图像是完全原始的,这意味着每个像素都计数(例如:一个完全红色的128x128位图需要与完全色彩丰富的空间相同的空间,具有完全相同的颜色深度。)

我为你提出了一个解决方案,它正在使用这个很棒的软件(我没有任何关联,除了我自己使用它,它很棒),它会立即创建你的spritesheets并导出各种格式的坐标供你使用。 TexturePacker

答案 2 :(得分:0)

您需要增加VM堆大小。我很乐意为你抓住链接,但我想这是我能做的最好的主题 - Increase heap size in Java

答案 3 :(得分:0)

根据图像的复杂程度,另一个答案可能是使用矢量图形。有许多库具有不同级别的文档和许可要求。

实施例; http://www.andengine.org/

https://play.google.com/store/apps/details?id=org.anddev.farmtower.eco(AndEngine在此游戏中使用)