我使用F64作为元素创建了一个分配,因为我需要64位精度进行计算:
Allocation mOutAllocation = Allocation.createSized(mRS,Element.F64(mRS),1,Allocation.USAGE_SCRIPT);
我试图在调用mScript.forEach_root(mOutAllocation)后返回结果。通常,您通常会将mOutAllocation复制到数组并处理数组,但double不是可用的数组类型之一(只有bytes [],int [],float [],short []和bitmap。
mScript.forEach_root(mOutAllocation);
double[] x = new double[1];
mInAllocation.copyTo(x);
有什么想法吗?
答案 0 :(得分:2)
你能把它读成长并将这些位转换为双倍吗?
假设您不需要字节交换,Double.longBitsToDouble(长位)应该进行转换。
需要很长时间(64位)并将该位模式解释为IEEE双倍。
编辑:尝试将其从int []转换为long
int[] ints = new int[]{0x01234567, 0x89abcdef};
long l = (long)ints[0] + ((long)ints[1])<<32;
double d = Double.longBitsToDouble(l);
答案 1 :(得分:2)
如果只需要将一个double
复制到RenderScript和从RenderScript复制// whatever.rs
double hopper;
void root(const double *in, //...
上下文,你可以声明一个非静态变量并使用
自动生成的getter / setter:
// Whatever.java
mScript = new ScriptC_whatever(mRS);
double hopper = 1.234;
mScript.set_hopper(hopper);
// whatever.rs
double *target;
void root(const double *in, //...
如果您需要完整的分配,可以使用NIO对您的阵列进行编码
加倍为字节数组。然后你可以将它们复制到分配
使用copyFromUncheced
。
我不知道如何以编程方式查询RenderScript上下文中的字节顺序 -
我发现我的需要通过反复试验来逆转。
// Whatever.java
public void copyDoublesTo(double[] entries, Allocation target)
throws IOException {
if (!target.getType().getElement().isCompatible(Element.F64(mRS)))
throw new RSRuntimeException("Type mismatch: Element != F64");
if (target.getType().getCount() != entries.length)
throw new RSRuntimeException("Type mismatch: wrong # of entries");
mScript.bind_target(target);
ByteArrayOutputStream bytes = new ByteArrayOutputStream(Double.SIZE * dim);
DataOutputStream longs = new DataOutputStream(bytes);
long temp;
for(int i=0; i!=dim; ++i) {
temp = Double.doubleToLongBits(entries[i]);
// reverse byte order:
temp = Long.reverseBytes(temp);
longs.writeLong(temp);
}
target.copyFromUnchecked(bytes.toByteArray());
}
Allocation
您还可以通过将double
绑定到a来初始化// whatever.rs
double *target;
void setTargetEntry(int index, double entry) {
target[index] = entry;
}
void root(const double *in, //...
指针然后循环遍历您的public void copyDoublesTo(double[] entries, Allocation target) {
if (!target.getType().getElement().isCompatible(Element.F64(mRS))) {
throw new RSRuntimeException("Type mismatch: Element != F64");
}
if (target.getType().getCount() != entries.length) {
throw new RSRuntimeException("Type mismatch: wrong # of entries");
}
mScript.bind_target(target);
for(int i=0; i!=entries.length; ++i) {
mScript.invoke_setTargetEntry(i, entries[i]);
}
}
数组,设置
每个条目:
double2
double
如果您需要float
或类似内容,请与Double2
交换copyTo
在Java中。这比另一个更自然地解决了你的问题
依赖于...创意包装方案的解决方案,所以RenderScript会
弄清楚麻烦的问题,比如你的字节顺序。但是,它需要
分配上的串行循环,慢
(你需要另一个来获取数据)。为了比较,当我
测试了这个复制2 ^ 10 {{1}}平均30ms,而原生
{{1}}方法只花了0.1毫秒。 (NIO方法大约需要2ms)