Android 渲染脚本永远不会在 GPU 上运行

标签 android gpgpu renderscript

正如标题所示。

我有一个想要使用的并行图像创建/处理算法。这是一种柏林噪声实现。

// 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);
}

作为比较,当我通过纹理四边形上的 fragment 着色器在 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 的示例就足够了。

最佳答案

您可以尝试使用 rs_fp_relaxed 而不是 rs_fp_full 来运行它吗?

#pragma rs_fp_relaxed

rs_fp_full 将强制您的脚本在 CPU 上运行,因为大多数 GPU 不支持全精度浮点运算。

关于Android 渲染脚本永远不会在 GPU 上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43073774/

相关文章:

image-processing - Cuda 中的噪声和模糊

android - Android Gradle实验和RenderScript实现

java - 在 Android 中使用 RenderScript 应用模糊会产生奇怪的输出

android - TextView 的自定义 ActionMode 不适用于所有设备

memory - 我可以将设备中的 cudaMemcpy 直接转换为主机 STL 向量吗?

CUDA 模型 - 什么是经纱尺寸?

android - 如何在 Android 中编辑和保存大位图?目前将其写成图 block ,但将它们重新组合在一起的速度很慢

android - 在设备上开发 react-native 时如何使用 HMR?

Android list 配置?

java - RecyclerView列表不正确显示ArrayList