Como passar valores de matriz para e do Android RenderScript usando Alocações
rabalhei recentemente com o RenderScript com a intenção de criar uma API que um programador possa usar com facilidade, semelhante à maneira como o Microsoft Accelerator funcion
O problema com o qual estou preso no momento em que quero passar valores para e da camada RenderScript e fazer com que tudo seja executado da maneira mais eficiente possível, esse é um extrato do meu código-fonte até agora:
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);
Isso apenas cria duas matrizes básicas e as preenche com valores e chama as funções que as enviarão para o RenderScrip
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;
}
Isto enviará um par de valores para o seguinte código 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);
}
Mas há dois problemas com isso, o primeiro é a natureza assíncrona do RenderScript, significa que, quando a camada Java solicita o valor, o script ainda não fez a operação ou destruiu o valor do objeto saída e iniciado no próximo. E, graças à baixa visibilidade de depuração do RenderScript, não há como saber.
O outro problema é que não é muito eficiente, o código está constantemente chamando a função RenderScript para adicionar dois números. Idealmente, eu gostaria de passar a matriz para o RenderScript e armazená-la em uma estrutura e fazer toda a operação em uma chamada de script, em vez de muitas. Mas, para recuperá-lo, acho que preciso usar a função rsSendtoClient, mas não encontrei nenhum material sobre como usá-la. E, de preferência, eu gostaria de usar a estratégia rsForEach, mas novamente as informações são assustadoras.
Se alguém tiver alguma idéia, eu ficaria muito grato. Obrigado
Will Scott-Jackson