Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.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
Android 在画布上绘制比屏幕大得多的路径时内存不足_Android_Android Canvas_Android View - Fatal编程技术网

Android 在画布上绘制比屏幕大得多的路径时内存不足

Android 在画布上绘制比屏幕大得多的路径时内存不足,android,android-canvas,android-view,Android,Android Canvas,Android View,我有一个Android视图,它比视图的可见部分大(例如10000x6000像素),我想在onDraw()方法中绘制路径。仅绘制与视口相交的路径,并且在大多数情况下效果很好,但当绘制的路径的边界框比视口大得多时,会分配太多内存,导致应用程序崩溃,并出现内存不足错误。即使将剪辑边界设置为视口,也会为路径的边界框所占用的整个区域分配内存: 在上面的示例中,视口仅为2000x1400像素,但在画布上绘制路径时,会分配内存以适合完整路径(7000x4000像素=112 MB) 有没有办法限制在这种情况下

我有一个Android视图,它比视图的可见部分大(例如10000x6000像素),我想在onDraw()方法中绘制路径。仅绘制与视口相交的路径,并且在大多数情况下效果很好,但当绘制的路径的边界框比视口大得多时,会分配太多内存,导致应用程序崩溃,并出现内存不足错误。即使将剪辑边界设置为视口,也会为路径的边界框所占用的整个区域分配内存:

在上面的示例中,视口仅为2000x1400像素,但在画布上绘制路径时,会分配内存以适合完整路径(7000x4000像素=112 MB)

有没有办法限制在这种情况下分配的内存量

顺便说一句,iOS在使用剪辑边界时会限制渲染光栅图像的大小


编辑:看起来这是硬件渲染层的一个已知问题:

我的解决方案可能不是最干净的,但满足了我的需要。我使用canvas.drawLines,它在每条线之间不留连接的交点,但工作起来非常顺利

float[] pathArray = new float[(nodes.size() - 1) * 4];
for (int i = 0; i < nodes.size() - 1; i++) {
    int index = i * 4;

    Node from = nodes.get(i);
    pathArray[index] = from.x;
    pathArray[index + 1] = from.y;

    Node to = nodes.get(i + 1);
    pathArray[index + 2] = to.x;
    pathArray[index + 3] = to.y;
}

正如我所说,结果将是线之间的链接断开,但不会出现oom问题

我猜您正在使用view ondraw方法绘制线,我将在一个主线程中运行以刷新视图,因此使用带有单独线程的曲面视图更新视图将解决此问题,主要用于游戏应用程序使用曲面视图绘制图形Surface View对于我需要做的事情来说是一件过分的事情。而且它不能解决渲染比屏幕大的路径所需的内存问题。
canvas.drawLines(pathArray, mDefaultPaint);