Недавно я работал с RenderScript с намерением создать API, который программист мог бы легко использовать, подобно тому, как работает Microsoft Accelerator.
Проблема, с которой я столкнулся на данный момент, заключается в том, что я хочу передавать значения на слой RenderScript и обратно, и чтобы все работало максимально эффективно. Это выдержка из моего исходного кода на данный момент:
int[] A = new int[10];
int[] B = new int[10];
for (int i = 0; i < 10; i++) {
A[i] = 2;
B[i] = i;
}
intAdd(A, B);
Это просто создает два базовых массива, заполняет их значениями и вызывает функции, которые отправят их в RenderScript.
private void intAdd(int[] A, int[] B) {
RenderScript rs = RenderScript.create(this);
ScriptC_rsintadd intaddscript = new ScriptC_rsintadd(rs, getResources(), R.raw.rsintadd);
mScript = intaddscript;
for(int i = 0; i < A.length; i++) {
setNewValues(mScript, A[i], B[i]);
intaddscript.invoke_intAdd();
int C = getResult(mScript);
notifyUser.append(" " + C);
}
}
public void setNewValues(Script script, int A, int B) {
mScript.set_numberA(A);
mScript.set_numberB(B);
}
public int getResult(Script script) {
int C = mScript.get_numberC();
return C;
}
Это отправит пару значений в следующий код RenderScript:
int numberA;
int numberB;
int numberC;
void intAdd() {
/*Add the two together*/
numberC = numberA + numberB;
/*Send their values to the logcat*/
rsDebug("Current Value", numberC);
}
Но есть две проблемы с этим, первая из них — асинхронный характер RenderScript означает, что когда уровень Java запрашивает значение, сценарий либо не имеет еще не выполнил операцию или уже сделал ее, уничтожил значение вывода и начал следующее. И благодаря низкой видимости отладки RenderScript невозможно сказать.
Другая проблема заключается в том, что это не очень эффективно, код постоянно вызывает функцию RenderScript для сложения двух чисел. В идеале я хотел бы передать массив в RenderScript и сохранить его в структуре, чтобы вся операция выполнялась в одном вызове скрипта, а не во многих.Но для того, чтобы вернуть его, я думаю, мне нужно использовать функцию rsSendtoClient, но я не нашел материала о том, как ее использовать. И предпочтительно я хотел бы использовать стратегию rsForEach, но опять же информация пугает.
Если у кого-нибудь есть идеи, буду очень признателен. Спасибо.
Уилл Скотт-Джексон