【发布时间】:2017-04-30 05:31:24
【问题描述】:
正如标题所说。
我有一个我想使用的并行图像创建/处理算法。这是一种 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 操作系统版本)以及其他几个新设备,但问题仍然存在。
那么,RenderScript 什么时候在 GPU 上运行?如果有人能给我一个运行 GPU 的 RenderScript 的例子就足够了。
【问题讨论】:
-
这是很久以前的事了。我无法解决这个问题,并且它与人们可能认为的
#pragma rs_fp_relaxed无关。关键在于我无法用自定义线程复制的AsyncTask的专长。只有官方示例在 GPU 上运行稳定。
标签: android gpgpu renderscript