我正在尝试使用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类型。这些参数是可选的。
2015年10月7日在What are the available kernel-functions that you can create on Renderscript?中,Stephen Hines写道:
唯一自动填充的参数是x,y,(在Android M中可能是z)。
我不完全确定API级别23支持z属性,但至少Android Studio是这样认为的。
提前感谢您的帮助。
这是我的Application 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
}
答案 0 :(得分:0)
因为我收到了错误消息:
rsdSetupInputOutputAttributes -30
的错误
我理所当然地认为内核无法正常工作,但是它可以正常工作,特殊属性z可用并正确填充。
最重要的是,我在具有相同操作系统版本(华为P9)的不同设备上尝试了相同的应用程序,并且它没有给出任何错误。似乎这个由LG运营商在2016年末推出的LG G4官方操作系统更新,有一个部分有缺陷的RenderScript实现。