Renderscript返回F64分配类型,你如何在java中读取它?

时间:2013-07-03 22:37:15

标签: android renderscript

我使用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);

有什么想法吗?

2 个答案:

答案 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)