gpt4 book ai didi

java - Android 内存不足异常存储大量字节

转载 作者:行者123 更新时间:2023-12-02 03:55:12 24 4
gpt4 key购买 nike

我正在 Android 中开发一个绘画应用程序。目前我正在研究撤消功能 - 我的想法是存储更改的像素的坐标和颜色。

我正在使用 RGB 来解决性能问题 - 因此它们存储在字节数组中。

currentRGBPixelArray 是包含旧 ARGB 值的数组。UpdatedRGBPixelArray 是包含新ARGB 值的数组。

如果总是 3 个字段中的值不同,我知道我必须存储这些值。这是在 Integer、Byte[] 对上完成的,其中 Integer 是 RGBPixelArray 中像素的索引。

但是使用这段代码,当存储大量数据时,我会遇到内存不足的异常(例如,如果背景或像 1920*1080 的屏幕这样的大区域被更改,可能会多次更改)。

这是我的代码:

List<Pair<Integer, Byte[]>> changeTupelHolder = new ArrayList<>();
for (int index = 0; index < width; index += 4)
{
if (currentRGBPixelArray[index] != updatedRGBPixelArray[index] ||
currentRGBPixelArray[index+1] != updatedRGBPixelArray[index+1] ||
currentRGBPixelArray[index+2] != updatedRGBPixelArray[index+2])
{
Pair<Integer, Byte[]> changeTupel =
new Pair<>(index,
new Byte[]{currentRGBPixelArray[index],
currentRGBPixelArray[index+1],
currentRGBPixelArray[index+2]});
changeTupelHolder.add(changeTupel);
}
}

然后,changeTupelHolder 再次存储在堆栈中,并在调用撤消时弹出。

如何处理内存不足异常?将changeTupelHolder存储在存储上是个好主意吗(性能?)?如果是,当应用程序内存不足时我该如何处理?

或者您对我的问题有完全不同的想法吗?

感谢您的帮助!

最佳答案

这是保存图像数据的极其低效的方式。保存图像数据的正确方式是字节数组byte data[]=new byte[4*NUM_PIXELS]。获取像素的颜色将是 data[pixelnum*4+COLOR_INDEX],其中颜色索引为 0(alpha)、1(红色)、2(绿色)和 3(蓝色)。

您这样做的方式 - 您正在创建数百万个小对象,每个小对象都有自己的大量开销,所有这些都是为了每个存储一个字节。这会毁掉一台电脑。手机在分配方面做得可怕,高性能 Android 代码的关键是最大限度地减少分配的对象数量。

我知道现代思想流派是在知道存在问题之前不要考虑性能,但是上面有一个巨大的星号 - 您仍然需要使用常识。常识应该告诉您,每个像素 1 个对象是一个坏主意。

关于java - Android 内存不足异常存储大量字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35563445/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com