为什么将 Float4 对象传递给 RenderScript 内核会出错?
Why passing Float4 object to a RenderScript Kernel gives error?
我使用以下过程将 float
个数字的数组传输到 RenderScript Kernel 并且工作正常。
float[] w = new float[10];
Allocation w_rs = Allocation.createSized(rs, Element.F32(rs), 10);
w_rs.copy1DRangeFrom(0, 10, w);
我想使用类似的过程来传输 Float4 值,如下所示
Float4[] w = new Float4[10];
for (int i = 0; i < 10; i++) {
w[i] = new Float4(i, 2*i, 3*i, 4*i);
}
Allocation w_rs = Allocation.createSized(rs, Element.F32_4(rs), 10);
w_rs.copy1DRangeFromUnchecked(0, 10, w);
导致以下错误
Object passed is not an Array of primitives
显然,w
应该是基元数组。但我希望 w
成为 Float4
.
的数组
您可以简单地使用:
float[] w = new float[4 * 10];
for (int i = 0; i < 10; i++) {
w[i * 4 + 0] = i;
w[i * 4 + 1] = i*2;
w[i * 4 + 2] = i*3;
w[i * 4 + 3] = i*4;
}
Allocation w_rs = Allocation.createSized(rs, Element.F32_4(rs), 10);
w_rs.copyFrom(w);
// Or
w_rs.copy1DRangeFrom(0,40,w);
无痛:)
参考:RenderScript: parallel computing on Android, the easy way
更深入的解释
在 RenderScript Java 源代码中,您会看到这个中间件函数:
public void copy1DRangeFromUnchecked(int off, int count, Object array) {
copy1DRangeFromUnchecked(off, count, array,
validateObjectIsPrimitiveArray(array, false),
java.lang.reflect.Array.getLength(array));
}
validateObjectIsPrimitiveArray
在任何复制方法调用上执行。您只能传递原始数组。
我使用以下过程将 float
个数字的数组传输到 RenderScript Kernel 并且工作正常。
float[] w = new float[10];
Allocation w_rs = Allocation.createSized(rs, Element.F32(rs), 10);
w_rs.copy1DRangeFrom(0, 10, w);
我想使用类似的过程来传输 Float4 值,如下所示
Float4[] w = new Float4[10];
for (int i = 0; i < 10; i++) {
w[i] = new Float4(i, 2*i, 3*i, 4*i);
}
Allocation w_rs = Allocation.createSized(rs, Element.F32_4(rs), 10);
w_rs.copy1DRangeFromUnchecked(0, 10, w);
导致以下错误
Object passed is not an Array of primitives
显然,w
应该是基元数组。但我希望 w
成为 Float4
.
您可以简单地使用:
float[] w = new float[4 * 10];
for (int i = 0; i < 10; i++) {
w[i * 4 + 0] = i;
w[i * 4 + 1] = i*2;
w[i * 4 + 2] = i*3;
w[i * 4 + 3] = i*4;
}
Allocation w_rs = Allocation.createSized(rs, Element.F32_4(rs), 10);
w_rs.copyFrom(w);
// Or
w_rs.copy1DRangeFrom(0,40,w);
无痛:)
参考:RenderScript: parallel computing on Android, the easy way
更深入的解释
在 RenderScript Java 源代码中,您会看到这个中间件函数:
public void copy1DRangeFromUnchecked(int off, int count, Object array) {
copy1DRangeFromUnchecked(off, count, array,
validateObjectIsPrimitiveArray(array, false),
java.lang.reflect.Array.getLength(array));
}
validateObjectIsPrimitiveArray
在任何复制方法调用上执行。您只能传递原始数组。