java - 如何使用分配将数组值传入和传出 Android RenderScript

标签 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);

这只是创建两个基本数组并用值填充它们并调用将它们发送到 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 函数,但我还没有找到任何关于如何使用它的 Material 。最好我想使用 rsForEach 策略,但信息还是很有限。

如果有人有任何想法,我将不胜感激。谢谢。

威尔·斯科特- jackson

最佳答案

目前我不确定这是否对您有帮助,但由于我知道通过 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);
     }
}

有必要子类化 RenderScript.RSMessageHandler 并覆盖 run() 方法。参见 http://developer.android.com/reference/android/renderscript/RenderScript.RSMessageHandler.html如果你还没有。基本上没有办法绕过异步性质,我发现它是一把双刃剑。

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

希望这至少能有所帮助。

关于java - 如何使用分配将数组值传入和传出 Android RenderScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9655346/

相关文章:

android - 在自定义 View 类中的何处设置自定义字体(扩展按钮)?

android - 在 BasicRenderScript 示例中找不到 ScriptC_saturation

java - 使用java代码获取完整的网页

android - 保留 fragment 不保留

android - 卸载应用程序后如何从 GCM 注销

java - llvm-rs-cc : error: unknown argument: '-target-api' in Android renderscript

java - 使用 renderScript 放大位图的一部分

java - 禁用 Java 中的按钮,直到填满所有字段

java套接字服务器,客户端检测到服务器已死

java - Java 8 时间 API 的 ObjectMapper 配置