所以我在Renderscript代码中有一个带有指针的结构:
typedef struct __attribute__((packed, aligned(4))) RGB {
float red;
float green;
float blue;
} RGB_t;
RGB_t *rgb;
这就是我如何为这个指针分配和绑定内存:
ScriptField_RGB rgbs = new ScriptField_RGB(mRS, bitmap.getWidth()*bitmap.getHeight());
function_script.bind_rgb(rgbs);
这就是我设置初始值的方法:
int index = 0;
for(int y = 0; y < bitmap.getHeight(); ++y) {
for(int x = 0; x < bitmap.getWidth(); ++x) {
int color = bitmap.getPixel(x, y);
ScriptField_RGB.Item i = new ScriptField_RGB.Item();
i.red = Color.red(color) / 255.0f;
i.green = Color.green(color) / 255.0f;
i.blue = Color.blue(color) / 255.0f;
rgbs.set(i, index, false);
index++;
}
}
rgbs.copyAll();
&#39; function_script&#39;是一个带有内核的脚本来填充&lt; RGB_t *&#39;,它完全是这样的:
#pragma version(1)
#pragma rs java_package_name(my.package)
#include "rgb.rs"
void __attribute__((kernel)) root(RGB_t pixel, uint32_t x) {
//rsDebug("before", rgb[x].red,rgb[x].green,rgb[x].blue);
rgb[x].red = pixel.red * 255.0f;
rgb[x].green = pixel.green * 255.0f;
rgb[x].blue = pixel.blue * 255.0f;
//rsDebug("after", rgb[x].red,rgb[x].green,rgb[x].blue);
}
使用以下命令运行此内核:
function_script.forEach_root(arrayOperational);
不会在Android图层更新我的ScriptField值。我仍然拥有以前我已经解决的旧价值观。
所以,如果我打电话:
rgbs.get(index)
我将获得完全符合我的旧价值,追逐根源&#39;当然是打电话。
如何在Android图层中反映我的更改?
答案 0 :(得分:1)
由于您正在处理Bitmap
类似数据(RGB值),因此您应该考虑使用输入和输出Allocation
对象而不是您自己的绑定。 Rendescript将有效地为您处理,而不必手动绑定这样的字段。
但是,如果必须执行此绑定,则需要设置字段的用法以包含Allocation.USAGE_SHARED
(使用不同的重载构造函数。)有了这些,您应该能够在Java中的字段对象上调用updateAllocation()
以从脚本中获取最新数据。如果这不起作用(取决于自动生成的代码),您可以尝试调用getAllocation()
然后调用Allocation.syncAll(Allocation.USAGE_SHARED)
以更新Allocation
以及脚本中的任何更改。此时,您的字段访问方法应该提供更新的值。