Java 正在处理3D渲染脚本分配,z属性不可用 背景
我正在尝试使用RenderScript对3D分配执行一些操作 我在这里创建分配:Java 正在处理3D渲染脚本分配,z属性不可用 背景,java,android,c99,renderscript,android-renderscript,Java,Android,C99,Renderscript,Android Renderscript,我正在尝试使用RenderScript对3D分配执行一些操作 我在这里创建分配: Type.Builder analyzer3DType = new Type.Builder(rsAnalyzer, Element.U8(rsAnalyzer)) .setX(allocationSize.getWidth() - allocationPadding * 2) .setY(allocationSize.getHeight() - allocationPadding * 2
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:RSDSetupInputOutAttributes:2051:输入参数数量不正确,应为:2实际1
W/Adreno RS:RSDScript InvokeForeach:2511:RSDSetupInputOutAttributes中的错误-30
如果不在根内核中插入z属性,问题就会消失。似乎z属性未被识别为特殊属性
我的目标是API 23,应该支持这个特殊属性。从文档中:
映射核函数或缩减核累加器函数可以使用特殊参数x、y和z访问当前执行的坐标,这些参数必须是int或uint32_t类型。这些参数是可选的
2015年10月7日,斯蒂芬·海因斯(Stephen Hines)写道:
唯一的自动填充参数是x、y(在Android M中可能是z)
我不完全确定API级别23是否支持z属性,但至少Android Studio这样认为
问题
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
}
因为我收到了一条错误消息: 来自RSDSetupInputOutAttributes的错误-30 我想当然地认为内核不工作,但它工作正常,特殊属性z可用并正确填充
最重要的是,我在不同的设备上用相同的操作系统版本(华为P9)尝试了相同的应用程序,它没有给出任何错误。看来,2016年末由TIM operator推出的LG G4官方操作系统更新中,RenderScript实现存在部分缺陷。您使用的是什么设备和操作系统版本?LG G4(H815),TIM品牌,安卓6.0,内核3.10.84,build MRA58K,SW V20k-222-01即使出现错误,内核是否仍能正常工作?如果是这样,你可以忽略它。谢谢sakridge,我试图忽略错误消息,内核工作正常!您还可以只使用x,y启动一个二维内核,并在内核本身或作为多个forEach调用在z上执行循环。可能取决于z的大小,但我猜多个forEach可能会更快。但如果您发现了,请尝试并报告:)