2014-09-04 115 views
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); 
} 
+0

您的'velocityY'和'velocityY_prev'绑定到RenderScript中的内存吗?你在调用'foreach_diffuseVelocityY()'之前和之后做什么? – 2014-09-05 17:27:47

+0

@LarrySchiefer我给他们分配了内存。在调用它之后,我调用set_bnd_velocityY_prev()修改了在'foreach_diffuseVelocityY()'中修改过的同一个数组/指针中的数据。在此之前,我用另一个数组/指针做同样的事情。他们会在每个OpenGL绘图中调用。 – FaNaT 2014-09-05 18:47:26

+0

RS调用大多数是用于调用核心RS引擎的JNI代码的简洁包装,因此应该创建最小的Java对象。这就是说,你的烟雾测试代码是一个很好的尺寸,因此可能很难缩小可能导致问题的原因。您是否尝试过使用systrace功能来更好地观察事物? – 2014-09-05 20:46:57

回答

0

的问题是与函数参数,因为的renderScript需要创建Fieldpackers来处理它们。所以,如果你有相同的问题删除函数参数然后复制粘贴功能和修改变量和调用不同的功能不漂亮,但它的工作原理。

(感谢您的帮助)