Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 位图太大-内存不足?_Java_Android - Fatal编程技术网

Java 位图太大-内存不足?

Java 位图太大-内存不足?,java,android,Java,Android,我正在尝试在我的设备上设置人的一些动作的动画。我已经创建了一个精灵表,结果是1.23Mb。图像尺寸为5000 x 1500像素。工作表有8行,每行都是它自己的操作。(向前走,鞠躬,跳…)。最长的动作是32张图片。因此图像基本上是32列,8行。所以,现在我加载它: 一旦我这样做: private Bitmap bmp; bmp = BitmapFactory.decodeResource(getResources(), R.drawable.myImage); 我得到一个错误: 线程[main]

我正在尝试在我的设备上设置人的一些动作的动画。我已经创建了一个精灵表,结果是1.23Mb。图像尺寸为5000 x 1500像素。工作表有8行,每行都是它自己的操作。(向前走,鞠躬,跳…)。最长的动作是32张图片。因此图像基本上是32列,8行。所以,现在我加载它:

一旦我这样做:

private Bitmap bmp;
bmp = BitmapFactory.decodeResource(getResources(), R.drawable.myImage);
我得到一个错误:

线程[main](挂起(异常OutOfMemoryError))
decodeResource(资源、int、BitmapFactory$选项) 行:385位图工厂。解码资源(资源,int)行:404
GameView。(上下文)行:25 FightActivity.onCreate(Bundle) 行:13战斗活动(活动)。性能创建(捆绑)行:4465
检测.callActivityOnCreate(活动,捆绑)行:1049
ActivityThread.performLaunchActivity(ActivityThread$ActivityClientRecord, 意图)行:1920
ActivityThread.handleLaunchActivity(ActivityThread$ActivityClientRecord, 意图)行:1981 ActivityThread.访问$600(ActivityThread, ActivityThread$ActivityClient记录,意图)行:123
ActivityThread$H.handleMessage(消息)行:1147
ActivityThread$H(处理程序)。dispatchMessage(消息)行:99 Looper.loop()行:137 ActivityThread.main(字符串[])行:4424
invokenactive(对象,对象[],类,类[],类,int, 布尔值)行:不可用的[native method]方法。调用(对象, 对象…)行:511 ZygoteInit$MethodAndArgsCaller.run()行:784
ZygoteInit.main(字符串[])行:551 NativeStart.main(字符串[]) 行:不可用[本机方法]

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


希望有人能帮助新手。

简单的计算就能得到答案。假设每像素32位,则有((5000x1500)像素)*(每像素32位)/(每字节8位)/(每Mb 1024*1024位)=28MB

我在谷歌搜索了一下,发现不同版本的Android和不同手机的默认堆大小在16MB到32MB之间。我认为24MB是最常见的。因此,很有可能您的图像内存不足。查看此帖子以了解堆大小:


编辑:增加Android虚拟机堆大小似乎不是一个好办法。这里有一个VMRuntime.getRuntime()函数,其中包含一个setMinimumHeapSize函数。但它似乎越来越不受欢迎。我建议您拆分sprite。

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

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

榜样;


(本游戏中使用的引擎)

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

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


我为你提出了一个解决方案,就是使用这个很棒的软件(除了我自己使用它之外,我与它没有任何关系,而且它很棒),它可以在短时间内创建你的精灵表,并以各种格式导出坐标供你使用

澄清-您是否正在尝试制作32*5k x 8*1.5k=19.2亿像素的图像?因为这会使32位进程崩溃没有问题,对不起。图像大小为5000×1500像素,文件大小为1.23MB。该图像包含8行“帧”,即每行32帧。因此,它包含32x8个图像,然后我会显示这些图像。因此,它包含256个小图像。文件大小不是这里的问题您的分辨率是当我第一次创建图像时,它只有5行32个图像,文件大小为0.8兆。它工作得很好。然后我在文件中添加了3行图像。同样的决议。。但现在,更大。现在它失败了。所以,因为我已经到了5000乘1500(当它只有5行时可能是3000乘1500),这就是问题所在?这是个问题(想法:1)检查格式-您需要32位还是8位。2) 将图像缩小[将其拆分或缩小]。3) 为什么它不是两个分辨率的幂呢?等等-文件大小是1.23MB。。。不是28兆字节。这是一个小文件。您的文件是bmp文件还是png/jpeg/gif/tiff文件?如果是后者,你的图像会被大大压缩,但当你把它作为位图加载时,它会被解压到最大尺寸。它是一种BMP文件格式。所以,你在想,也许在内存中,Android正在“解压”你上面提到的文件,它使用28MB的内存来存储图像,磁盘上的图像是1.23Mb?是的。快速浏览维基百科并了解了一些新的内容:)“索引彩色图像可能会使用4位或8位RLE或哈夫曼1D算法进行压缩。OS/2 BITMAPCOREHEADER2 24bpp图像可能会使用24位RLE算法进行压缩。”所以很可能你的BMP被压缩了。哦,该死的。因此,我唯一的选择是分离我所需要的行