0

我正在尝试在我的设备上为某个人的一些动作设置动画。我创建了一个精灵表,最终为 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) 行:385 BitmapFactory.decodeResource(Resources, int) 行:404
GameView.(Context) 行:25 FightActivity。 onCreate(Bundle) 行:13 FightActivity(Activity).performCreate(Bundle) 行:4465
Instrumentation.callActivityOnCreate(Activity, Bundle) 行:1049
ActivityThread.performLaunchActivity(ActivityThread$ActivityClientRecord, Intent) 行:1920
ActivityThread.handleLaunchActivity(ActivityThread$ActivityClientRecord , Intent) 行: 1981 ActivityThread.access$600(ActivityThread, ActivityThread$ActivityClientRecord, Intent) 行: 123
ActivityThread$H.handleMessage(Message) line: 1147
ActivityThread$H(Handler).dispatchMessage(Message) line: 99 Looper.loop() line: 137 ActivityThread.main(String[]) line: 4424
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method] Method.invoke(Object, Object...) line: 511 ZygoteInit$MethodAndArgsCaller.run() line: 784
ZygoteInit。 main(String[]) 行:551 NativeStart.main(String[]) 行:不可用 [本机方法]

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

希望有人可以帮助新手。

4

4 回答 4

1

一个简单的计算给你答案。假设每像素 32 位,则 ((5000x1500) 像素) * (每像素 32 位) / (每字节 8 位) / (1024 * 每 Mb 1024 位) = 28MB。

我进行了谷歌搜索,我看到了不同版本的 Android 和不同手机的默认堆大小,范围从 16MB 到 32MB。我想我认为 24​​MB 是最常见的。因此,您很可能只是因为图像内存不足。查看这篇文章,看看你的堆大小是多少:https ://stackoverflow.com/a/9428660/1448071 。

编辑:似乎没有增加 Android 虚拟机堆大小的好方法。这里有一个带有 setMinimumHeapSize 函数的 VMRuntime.getRuntime() 函数Android: how to increase heap size at runtime? . 但它似乎正在被弃用。我建议你拆分你的精灵。

于 2012-07-29T03:37:20.997 回答
1

为角色中的每个动画制作一个单独的 spritesheet,保存对常见动画的引用,并根据需要加载。这足够灵活,您的动画不会滞后,除非您需要从内存中加载位图更改,例如当您从运行更改为空闲或其他时,(尽管这两个足够常见,您可以将它们保存在很长一段时间的记忆)。

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

我为您提出了一个解决方案,它使用了这个很棒的软件(我与它没有任何关系,除了我自己使用它,它很棒),它将立即创建您的 spritesheets 并以各种格式导出坐标供您使用采用。纹理包装器

于 2012-07-29T20:09:07.960 回答
0

您需要增加 VM 堆大小。我很想为你获取链接,但我想这是我能做的最好的 atm -增加 Java 中的堆大小

于 2012-07-29T03:48:12.883 回答
0

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

例子; http://www.andengine.org/

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

于 2012-07-29T04:03:10.437 回答