#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.