Renderscript和垃圾收集器

时间:2014-09-04 20:45:14

标签: garbage-collection renderscript

最近我修改了我的代码以将所有内容存储在renderscript中(之前我来回复制数据并没有效果),但现在垃圾收集器就像疯了一样收集垃圾。 (仍然应用程序以这种方式更好地执行。)

我无法弄清楚需要收集什么,我会使用我不会在函数中创建新数组的所有内容,我经常调用它们。我唯一的想法是,如果我这样做:

void __attribute__((kernel)) diffuseVelocityY(float in, uint32_t x, uint32_t y) {
     velocityY_prev[x] = velocityY[x] + a*(velocityY_prev[x-1] + velocityY_prev[x+1] + velocityY_prev[x-(width)] + velocityY_prev[x+(width)])/(1+(4*a));
}

它为它创建了一个温度指针,因为我使用了我想要更新的同一指针中的数据(我不知道这是否适用)。我试图改变它,所以它将数据放在一个空指针中,在它完成后我将数据复制到正确的位置。它似乎收集了更少的垃圾,但仍然有垃圾收集,并且性能也下降了。

我上传了我的代码here,如果有人想要查看(_befores来自我修改代码之前)。

我不知道如何停止垃圾收集,我希望有人可以提供帮助。

其中一种方法:

void set_bnd_densiy_prev(int b){
        for (int i = 1; i <= gridSizeY; i++) {
            density_prev[IX(0, i)] = (b == 1 ? -density_prev[IX(1, i)] : density_prev[IX(1, i)]);
            density_prev[IX(gridSizeX + 1, i)] = (b == 1 ? -density_prev[IX(gridSizeX, i)] : density_prev[IX(gridSizeX, i)]);
        }
        for (int i = 1; i <= gridSizeX; i++) {
            density_prev[IX(i, 0)] = (b == 2 ? -density_prev[IX(i, 1)] : density_prev[IX(i, 1)]);
            density_prev[IX(i, gridSizeY + 1)] = (b == 2 ? -density_prev[IX(i, gridSizeY)] : density_prev[IX(i, gridSizeY)]);
        }
    density_prev[IX(0 ,0 )] = 0.5f*(density_prev[IX(1,0 )]+density_prev[IX(0 ,1)]);
    density_prev[IX(0 ,gridSizeY+1)] = 0.5f*(density_prev[IX(1,gridSizeY+1)]+density_prev[IX(0 ,gridSizeY )]);
    density_prev[IX(gridSizeX+1,0 )] = 0.5f*(density_prev[IX(gridSizeX,0 )]+density_prev[IX(gridSizeX+1,1)]);
    density_prev[IX(gridSizeX+1,gridSizeY+1)] = 0.5f*(density_prev[IX(gridSizeX,gridSizeY+1)]+density_prev[IX(gridSizeX+1,gridSizeY )]);
}

从中生成的代码:

   private final static int mExportFuncIdx_set_bnd_densiy_prev = 3;
    public void invoke_set_bnd_densiy_prev(int b) {
    FieldPacker set_bnd_densiy_prev_fp = new FieldPacker(4);
    set_bnd_densiy_prev_fp.addI32(b);
    invoke(mExportFuncIdx_set_bnd_densiy_prev, set_bnd_densiy_prev_fp);
}

1 个答案:

答案 0 :(得分:0)

问题在于函数args,因为renderscript需要创建Fieldpackers来处理它们。因此,如果你有相同的问题删除函数args然后复制粘贴函数并修改变量并调用不同的函数不漂亮,但它的工作原理。

(感谢帮帮忙)