Как передавать значения массива в Android RenderScript и из него с помощью распределений

Недавно я работал с 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, но опять же информация пугает.

Если у кого-нибудь есть идеи, буду очень признателен. Спасибо.

Уилл Скотт-Джексон

9
задан Eng.Fouad 11 March 2012 в 13:33
поделиться