【发布时间】:2016-02-22 20:43:54
【问题描述】:
我正在开发 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 再次存储在 Stack 中,并在调用 undo 时弹出。
如何处理内存不足异常? 将 changeTupelHolder 存储在存储上是个好主意(性能?)? 如果是,当应用程序趋于内存不足时,我该怎么做?
或者你对我的问题有完全不同的想法?
感谢您的帮助!
【问题讨论】:
-
您能否详细解释一下您应该在什么时候存储更改?什么情况下会触发你的代码?另外,你可以使用 SVG 之类的东西吗?
-
这只是一个简单的绘画活动——如果我画一个圆,填充一个区域或任何我想存储旧像素的东西。
-
如果它只是一个简单的绘画活动,那么您应该能够使用向量并将它们作为路径存储在您的堆栈中。
标签: java android out-of-memory bytearray