Это мой третий вопрос о RenderScript, и я запрограммировал проект обработки изображений более 3 месяцев с помощью rs. Rs мощный, я могу использовать параллельное ядро, похожее на шейдер OpenGLES, а также я могу написать последовательный код для размытия рамки. Это потрясающе!
Но теперь у меня новая проблема.
Обычно эффект отображается с помощью динамических эскизов на кнопке, прежде чем пользователи выберут, какой эффект применить. Поэтому я создаю поток для каждой миниатюры кнопки, и каждый поток имеет свой собственный rs и контекст. Поток создает и использует выделения по своему собственному rs и контексту, поэтому ошибка типа «использование объекта с несовпадающим контекстом» не должна возникать. К сожалению, это случилось.
FATAL EXCEPTION: AsyncTask #4
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:200)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
at java.lang.Thread.run(Thread.java:1027)
Caused by: android.support.v8.renderscript.RSInvalidStateException: using object with mismatched context.
at android.support.v8.renderscript.BaseObj.getID(BaseObj.java:66)
at android.support.v8.renderscript.Script.setVar(Script.java:382)
at com.xxxxxxxxxxx.xxxxxxxx.algorithms.filter.Script_BaseFilter.set_gTableTex(ScriptC_BaseFilter.java:280)
…………(not important)
Я знаю, что я не могу использовать многопоточность для рендеринга текстуры с помощью OpenGLES, но я не читал ничего подобного в rs.
Самое ужасное, что иногда некоторые строки пикселя в одной миниатюре заменяются пикселем другой миниатюры той же строки!!! Сбой происходит не каждый раз, в основном большое исходное изображение или один эффект, обработка которого занимает много времени, имеют более высокую вероятность завершения работы даже всей программы.
Это ошибка или rs не может быть вызвана многопоточностью?