2014-09-04 118 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來處理它們。所以,如果你有相同的問題刪除函數參數然後複製粘貼功能和修改變量和調用不同的功能不漂亮,但它的工作原理。

(感謝您的幫助)