如何使用Allocations将数组值传入和传出Android RenderScript

Wil*_*son 9 java 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);
Run Code Online (Sandbox Code Playgroud)

这只是创建两个基本数组并用值填充它们并调用将它们发送到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;
}
Run Code Online (Sandbox Code Playgroud)

这将向以下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);
 }
Run Code Online (Sandbox Code Playgroud)

但是这有两个问题,第一个是RenderScript的异步性质意味着当Java层请求值时,脚本还没有完成操作,或者它已经完成了它,破坏了输出的值并开始下一个.由于RenderScript的低调试可见性,无法说明.

另一个问题是它效率不高,代码不断调用RenderScript函数将两个数字加在一起.理想情况下,我想将数组传递给RenderScript并将其存储在结构中,并在一个脚本调用中完成整个操作,而不是很多.但是为了得到它我认为我需要使用rsSendtoClient函数,但我没有找到任何关于如何使用它的材料.最好是我想使用rsForEach策略,但信息又是恐慌.

如果有人有任何想法我会非常感激.谢谢.

威尔斯 - 杰克逊

Jar*_*red 2

我不确定这对您目前是否有帮助,但由于我知道使用 RenderScript 工作有多么痛苦,因此以下是我可以提供的帮助。为了使用 rsSendToClient 函数,您需要指示您创建的 RenderScript 实例将消息发送到哪里。这是通过以下方式完成的:

private void intAdd(int[] A, int[] B) {
     RenderScript rs = RenderScript.create(this);

     MySubclassedRSMessageHandler handler = new MySubclassedRSMessageHandler();
     rs.setMessageHandler(handler);
     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);
     }
}
Run Code Online (Sandbox Code Playgroud)

需要子类化 RenderScript.RSMessageHandler 并重写 run() 方法。如果您还没有,请参阅http://developer.android.com/reference/android/renderscript/RenderScript.RSMessageHandler.html 。基本上没有办法绕过异步特性,我认为这是一把双刃剑。

至于效率低下,我会考虑创建一个 RenderScript 实例,让它运行(不需要时可以暂停它,将保留在内存中但停止线程,从而不会在每次调用函数时产生构造成本)。从这里您可以拥有自己的结构,然后使用反映的 Java 层的 invoke_myFunction(此处的一些参数)。

希望这至少有一点帮助。