0

背景

我正在尝试使用 RenderScript 对 3D 分配执行一些操作。

在这里我创建分配:

 Type.Builder analyzer3DType = new Type.Builder(rsAnalyzer, Element.U8(rsAnalyzer))
      .setX(allocationSize.getWidth() - allocationPadding * 2)
      .setY(allocationSize.getHeight() - allocationPadding * 2)
      .setZ(framesNumber);

 analyzer3DAllocation = Allocation.createTyped(rsAnalyzer, analyzer3DType.create(), Allocation.USAGE_SCRIPT);

然后设置 Java 端并启动内核:

ScriptC_analyze rsAnalyze = new ScriptC_analyze(rsAnalyzer);
rsAnalyze.forEach_root(analyzer3DAllocation);

这就是内核的样子:

void RS_KERNEL root(uchar in, uint32_t x, uint32_t y, uint32_t z) {
   // Do something.
}

请注意,我需要两个不同的 RenderScript 上下文来并行执行,因此这就是我创建 RenderScript 对象的方式:

rsAnalyzer = RenderScript.createMultiContext(context, RenderScript.ContextType.NORMAL, RenderScript.CREATE_FLAG_NONE, 23);

问题

我收到此运行时错误:

W/Adreno-RS:rsdSetupInputOutputAttributes:2051:输入参数的数量不正确,预期:2 实际 1

W/Adreno-RS: rsdScriptInvokeForEach:2511: 来自 rsdSetupInputOutputAttributes 的错误 -30

如果我不在根内核中插入 z 属性,问题就会消失。似乎 z 属性未被识别为特殊属性。

我的目标是 API 23,应该支持这个特殊属性。从文档:

映射核函数或归约核累加器函数可以使用特殊参数 x、y 和 z 访问当前执行的坐标,这些参数必须是 int 或 uint32_t 类型。这些参数是可选的。

您可以在Renderscript 上创建哪些可用的内核函数?2015 年 10 月 7 日,斯蒂芬·海因斯写道:

唯一自动填充的参数是 x、y(在 Android M 中可能还有 z)。

我不完全确定 API 级别 23 是否支持 z 属性,但至少 Android Studio 是这样认为的。

问题

  1. 难道我做错了什么?有没有办法在 API 级别 23 的内核中使用 z 属性?
  2. 如果不是,那么如果我不仅需要在 x 和 y 轴上以及沿 z 轴上迭代元素,那么实现这一点的最佳方法是什么?

预先感谢您的帮助。

附加信息

这是我的应用程序 build.gradle 的一部分:

android {
compileSdkVersion 25
buildToolsVersion "25.0.2"

defaultConfig {
    minSdkVersion 23
    targetSdkVersion 23
    renderscriptTargetApi 23
}

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}
4

1 回答 1

0

由于我收到一条错误消息:

来自 rsdSetupInputOutputAttributes 的错误 -30

我理所当然地认为内核没有工作,但它工作正常,特殊属性 z 可用并正确填充。

最重要的是,我在具有相同操作系统版本(华为 P9)的不同设备上尝试了相同的应用程序,它没有给出任何错误。TIM 运营商于 2016 年底推出的 LG G4 官方操作系统更新似乎存在部分缺陷的 RenderScript 实现。

于 2017-02-02T14:24:44.073 回答