2014-09-04 3 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()'? –

+0

@LarrySchiefer Я выделил им память. После его вызова я включил 'set_bnd_velocityY_prev()' он изменяет данные в том же массиве/указателе, который был изменен в 'foreach_diffuseVelocityY()'. До этого я делаю то же самое с другим массивом/указателем. Они получаются в каждом розыгрыше OpenGL. – FaNaT

+0

Звонки RS в основном тонкие обертки вокруг кода JNI для вызова в основной двигатель RS, поэтому должны быть созданы минимальные объекты Java. Это, как говорится, ваш код анализа дыма является хорошим размером, поэтому может быть трудно сузить то, что может вызвать проблему. Вы пытались использовать функциональность systrace, чтобы лучше смотреть на вещи? –

ответ

0

Проблемы была с функцией аргументами, потому что Renderscript необходимо создать Fieldpackers для обработки их. Поэтому, если у вас есть одна и та же проблема, удалите функцию args, затем скопируйте в нее функцию и измените переменные и вызовите различные функции не очень, но она работает.

(Спасибо thebaron за вашу помощь)

Смежные вопросы