Как освободить память в Renderscript в Android?

#android #renderscript

#Android #renderscript

Вопрос:

Профилировщик в Android Studio показывает, что мое приложение Renderscript имеет утечку памяти в графической памяти. Я написал некоторый тестовый код и успешно воспроизвел проблему, но я не знаю, как ее решить.

Код Renderscript

 void memoryTest(rs_allocation output) {
    rs_allocation tmp;
    for(int i = 0; i < 10; i  ) {
        tmp = rsCreateAllocation_char(1000, 1000);
    }
}
 

Код Kotlin

 val rs: RenderScript = RenderScript.create(this)
while (true) {
    val script = ScriptC_singlesource(rs)
    val outputAllocation = Allocation.createTyped(rs, Type.createXY(rs, Element.I16(rs), 1000, 1000))
    script.invoke_memoryTest(outputAllocation)
    outputAllocation.destroy()
    script.destroy()
}
 

Использование памяти
Использование памяти
Я завершил запуск через 15 секунд, поэтому память отключилась.

Я пробовал free(tmp) , delete tmp , delete(tmp) , все приводит к ошибке компиляции. Я хочу знать, как освободить память rs_allocation , созданную внутри Renderscript.

Редактировать

Я попробовал rsClearObject(rs_allocation*) , Renderscript стал

 void memoryTest(rs_allocation output) {
    rs_allocation tmp;
    for(int i = 0; i < 10; i  ) {
        rsClearObject(amp;tmp);
        tmp = rsCreateAllocation_char(1000, 1000);
    }
}
 

Это не решило проблему. Использование памяти остается прежним. Похоже, это не имеет никакого эффекта.

Ответ №1:

Наконец-то решил это. Вам просто нужно использовать другую переменную внутри цикла для создания rs_allocation , а затем передать ее внешней переменной.

 void memoryTest(rs_allocation output) {
    rs_allocation tmp;
    for(int i = 0; i < 10; i  ) {
        rs_allocation tmp2 = rsCreateAllocation_char(1000, 1000);
        tmp = tmp2;

        //In my case tmp is a global variable used to pass value to kernel functions,
        //so it has to be outside.
        somefunctionThatUseTmp();
    }
}
 

Я не могу объяснить, почему это работает, это противоречит моему пониманию того, как работают указатели в C.

нет утечки памяти