正如标题所说。
我有一个我想要使用的并行图像创建/处理算法。这是一种perlin噪声实现。
// Logging is never used here
#pragma version(1)
#pragma rs java_package_name(my.package.name)
#pragma rs_fp_full
float sizeX, sizeY;
float ratio;
static float fbm(float2 coord)
{ ... }
uchar4 RS_KERNEL root(uint32_t x, uint32_t y)
{
float u = x / sizeX * ratio;
float v = y / sizeY;
float2 p = {u, v};
float res = fbm(p) * 2.0f; // rs.: 8245 ms, fs: 8307 ms; fs 9842 ms on tablet
float4 color = {res, res, res, 1.0f};
//float4 color = {p.x, p.y, 0.0, 1.0}; // rs.: 96 ms
return rsPackColorTo8888(color);
}
作为比较,当我通过纹理四边形上的片段着色器在gpu上实现它时,这个精确的算法运行至少30 fps。
运行RenderScript的开销应该是最大100毫秒,我通过返回x和y标准化坐标来制作一个简单的位图。
这意味着万一它会使用gpu肯定不会变成10秒。
我正在使用RenderScript的代码:
// The non-support version gives at least an extra 25% performance boost
import android.renderscript.Allocation;
import android.renderscript.RenderScript;
public class RSNoise {
private RenderScript renderScript;
private ScriptC_noise noiseScript;
private Allocation allOut;
private Bitmap outBitmap;
final int sizeX = 1536;
final int sizeY = 2048;
public RSNoise(Context context) {
renderScript = RenderScript.create(context);
outBitmap = Bitmap.createBitmap(sizeX, sizeY, Bitmap.Config.ARGB_8888);
allOut = Allocation.createFromBitmap(renderScript, outBitmap, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_GRAPHICS_TEXTURE);
noiseScript = new ScriptC_noise(renderScript);
}
// The render function is benchmarked only
public Bitmap render() {
noiseScript.set_sizeX((float) sizeX);
noiseScript.set_sizeY((float) sizeY);
noiseScript.set_ratio((float) sizeX / (float) sizeY);
noiseScript.forEach_root(allOut);
allOut.copyTo(outBitmap);
return outBitmap;
}
}
如果我将其更改为FilterScript,使用此帮助(https://stackoverflow.com/a/14942723/4420543),在支持库的情况下,我会得到几百毫秒的情况,在不支持的情况下,我的情况会加倍。精度不影响结果。
我还检查了stackoverflow上的每个问题,但是大多数问题已经过时了,我还尝试使用nexus 5(7.1.1 os版本)和其他几个新设备,但问题仍然存在。
那么,RenderScript何时在GPU上运行?如果有人可以在运行GPU的RenderScript上给我一个例子就足够了。
答案 0 :(得分:3)
您可以尝试使用rs_fp_relaxed而不是rs_fp_full来运行它吗?
#pragma rs_fp_relaxed
rs_fp_full将强制您的脚本在CPU上运行,因为大多数GPU都不支持全精度浮点运算。
答案 1 :(得分:0)
我同意你的猜测。
在Nexux 7(2013,JellyBean 4.3)上,我分别写了一个renderscript和一个filtercript来计算着名的Mandelbrot集。 与执行相同操作的OpenGL片段着色器(所有具有32位浮点数)相比,脚本大约是慢的3倍。我假设OpenGL使用GPU,其中renderscript(和filterscript!)没有。
然后我分别将相机预览转换(NV21格式 - > RGB)与renderscript,filterscript和ScriptIntrinsicYuvToRGB进行比较。 这里 Intrinsic比自编脚本快4倍。 我再次看到renderscript和filterscript之间的性能没有差异。在这种情况下,我假设自编写的脚本只在内部使用GPU的情况下再次使用CPU(也是?)。