【问题标题】:RenderScript Allocation. Read int from Allocation渲染脚本分配。从分配中读取 int
【发布时间】:2014-03-01 16:28:16
【问题描述】:

在 Java 中,我有这段代码用于为 intPointer 创建分配。但是在渲染脚本计算之后,我无法取回分配的值。没有copyTo(int)方法只有byte[], short[], int[], float[], bitmap。

    //Create Allocation
    Allocation intPointer = Allocation.createSized(renderScript, Element.I32(renderScript), 2);

    convolution.bind_intPointer(intPointer);
    convolution.forEach_root(allocationOut);

    [...]
    //read Allocation, not working
    int[] ints = new int[]{0x01234567};
    intPointer.copyTo(ints);             //does not overwrite the ints the line above
    int i = (int)ints[0];
    Log.d("ints", String.valueOf(i));

渲染脚本:

#pragma version(1)
#pragma rs java_package_name(package com.ap.wificam)
#pragma rs_fp_imprecise

rs_allocation input;
rs_allocation mask;

int32_t *intPointer = 0;

void root(uchar4* out, uint32_t x, uint32_t y) {

    //do some stuff

    if((sum.x + sum.y + sum.z)/3 > *intPointer)
        *intPointer = (sum.x + sum.y + sum.z)/3;    //wirte data to intPointer

    *out = convert_uchar4(sum);
}

Log.d("ints", String.valueOf(i));给我D/ints﹕ 19088743 和 rsDebug("rs", *intPointer); 2045 0x7fd

如何从分配中获取我的 int 值?

【问题讨论】:

  • 使用这段代码我可以读取 int: int[] ints = new int[]{0x0,0x0}; intPointer = 卷积.get_intPointer(); intPointer.copyTo(ints); int[] 数组需要有两个元素。

标签: android renderscript


【解决方案1】:

您的 RenderScript 设置似乎是正确的,但我认为您在正确初始化分配中的数据时遇到了问题。

由于在比较 sum 平均值是否大于 *intPointer 时,您正在读取 RenderScript 中的分配值,因此您需要确保它的起始值是您实际期望的值.否则它将有未初始化的数据,> 比较将在大多数情况下失败。

我想这就是你试图用int32_t *intPointer = 0; 做的事情,但这并不是在 C 中初始化指针数据的真正正确方法。最简单的方法是在你之后立即从 Java 复制数据创建分配:

Allocation intPointer = Allocation.createSized(renderScript, Element.I32(renderScript), 2);
intPointer.copy1DRangeFrom(0, 2, new int[2]);
convolution.bind_intPointer(intPointer);

这将确保在您的 RS 内核开始时所有值都是 0(因为在 Java 中,new int[2] 创建了一个 0 初始化数组)。

此外,您的代码可能不是完全线程安全的。由于您将有许多线程同时读取和写入该单个*intPointer 地址,因此您可能会遇到同步问题,您从中获得的最终值可能是也可能不是所有线程的真正全局最大值。

我建议不要这样做,而是将 all (sum.x + sum.y + sum.z)/3 值存储在与输入数据一样大的分配中,然后将该分配复制回 Java 并从那里复制,对其数组进行简单循环以找到最大值。

从 RenderScript 内核中正确并行化最大算法实际上有点困难(如果您有兴趣,可以阅读我前段时间发布的 this other answer 了解更多详细信息),所以为了简单起见,您可以最好按照我上面的建议从 Java 中找到最大值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多