我最近一直在使用 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 策略,但信息又是可怕的。
如果有人有任何想法,我将不胜感激。谢谢。
将斯科特-杰克逊