0
最近我修改了我的代码,将所有内容都存储在了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));
}
它为它创建一个temperaly指针,因为我使用的是从我要更新相同的指针数据(我不知道如果是这样的方式,作品)。我试图改变它,所以它把数据放在一个空指针中,并在完成后将数据复制到正确的位置。看起来它收集的垃圾更少,但仍然有垃圾收集,性能也下降了。
我上传了我的代码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);
}
您的'velocityY'和'velocityY_prev'绑定到RenderScript中的内存吗?你在调用'foreach_diffuseVelocityY()'之前和之后做什么? – 2014-09-05 17:27:47
@LarrySchiefer我给他们分配了内存。在调用它之后,我调用set_bnd_velocityY_prev()修改了在'foreach_diffuseVelocityY()'中修改过的同一个数组/指针中的数据。在此之前,我用另一个数组/指针做同样的事情。他们会在每个OpenGL绘图中调用。 – FaNaT 2014-09-05 18:47:26
RS调用大多数是用于调用核心RS引擎的JNI代码的简洁包装,因此应该创建最小的Java对象。这就是说,你的烟雾测试代码是一个很好的尺寸,因此可能很难缩小可能导致问题的原因。您是否尝试过使用systrace功能来更好地观察事物? – 2014-09-05 20:46:57