背景
我正在尝试使用 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 是这样认为的。
问题
- 难道我做错了什么?有没有办法在 API 级别 23 的内核中使用 z 属性?
- 如果不是,那么如果我不仅需要在 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
}