【发布时间】:2017-01-12 08:09:41
【问题描述】:
根据我的研究,我发现无法从 RenderScript 内部分配内存。例如,int* values = new int[10]; 在 C99 中是不允许的。我希望这个数组对于当前正在处理的像素是本地的,这样的动态分配将保证它是否是从内核函数内部声明和实例化的。
我知道int values[10]; 是一个有效的声明。如果我把它放在 RenderScript 的开头,它就会变成一个全局数组,我们可以从 Java 代码中设置它(使用 Allocation)。
我尝试将int values[10]; 放入内核中,我认为它是当前像素的本地。我知道声明一个单值变量(如 uint32_t、float4 等)绝对是当前像素的局部变量。然而,在内核中声明的数组仍然是一个全局变量——所有其他像素都可以读取和写入它。
uchar4 RS_KERNEL mykernel(uchar4 in, uint32_t x, uint32_t y){
int* values = (int*)malloc(sizeof(int)*256); // illegal
int* values2 = new int[256]; // illegal
int values3[256]; // legal, but it's global. I want a local array
}
如果您想知道,我想从当前像素 (x, y) 访问相邻像素。我已经能够做到这一点。但是,我需要将一些像素信息(比如每个相邻像素的颜色分量中的一个)存储在一个数组中,因为我可能需要挑选出最常出现的颜色分量,一旦该数组被排序,就需要准确的中间分量等. 所以,我正在尝试拉模式和中值过滤器,甚至是油画效果——所有这些都需要我将相邻像素数据存储在本地数组中。
那么,我们如何在 RenderScript 中声明一个本地/私有数组,只有当前正在处理的像素可以触摸?如果这不可能,我如何模拟需要仅具有单值变量的任务的本地数组?
更新
上面的int values3[256]; 确实是当前线程的本地。事实证明,它可能包含我们不想要的垃圾值。我假设每个索引的值默认为 0。有些是,有些不是。这就是为什么我认为所有其他线程都在写它。我打算将上述内容作为计数,所以我并不总是按预期从 0 开始。这就是我的计算失败的原因!
【问题讨论】:
标签: android renderscript android-renderscript