我现在在Android上编程,我想知道我们现在是否可以使用GPGPU for Android?我曾经听说Renderscript将来可能会在GPGPU上执行.但我想知道我们现在是否有可能在GPGPU上进行编程?如果我可以在Android GPGPU上编程,我在哪里可以找到一些教程或示例程序?感谢您的帮助和建议.
到目前为止,我知道OpenGL ES库现在加速使用GPU,但我想使用GPU进行计算.我想要做的是加速计算,以便我希望使用一些API库,如OpenCL.
我的问题是:我在Android中设置了一个摄像头并通过使用onPreviewFrame监听器接收预览数据,该监听器向我传递一个包含默认android YUV格式的图像数据的byte []数组(设备不支持R5G6B5-格式).每个像素由12位组成,这使得事情有点棘手.现在我想要做的是将YUV数据转换为ARGB数据,以便用它进行图像处理.这必须使用renderscript来完成,以保持高性能.
我的想法是在一个元素中传递两个像素(这将是24位= 3个字节),然后返回两个ARGB像素.问题是,在Renderscript中,u8_3(三维8位向量)存储在32位,这意味着最后8位未使用.但是当将图像数据复制到分配中时,使用了所有32位,因此最后8位丢失.即使我使用32位输入数据,最后8位也没用,因为它们只有2/3像素.在定义包含3字节数组的元素时,它实际上具有3个字节的实际大小.但是然后Allocation.copyFrom() - 方法没有用数据填充in-Allocation,认为它没有用byte []填充正确的数据类型.
renderscript文档指出,有一个ScriptIntrinsicYuvToRGB应该在API级别17中完全执行.但实际上该类不存在.我已经下载了API Level 17,即使它似乎不再可以下载了.有没有人有任何关于它的信息?有没有人尝试过ScriptIntrinsic?
总而言之,我的问题是:如何快速,快速地将摄像机数据转换为ARGB数据?
这是在Dalvik VM中如何做到这一点(在网上找到代码,它的工作原理):
@SuppressWarnings("unused")
private void decodeYUV420SP(int[] rgb, byte[] yuv420sp, int width, int height) {  
    final int frameSize = width * height;  
    for (int j = 0, yp = 0; j < height; j++) {
        int uvp = frameSize + (j >> 1) * width, u = 0, v = 0;  
        for (int i = 0; i < width; i++, yp++) {  
            int y = (0xff & ((int) yuv420sp[yp])) …RenderScript无法在Android 2.3模拟器上运行.
04-04 15:37:39.146: W/dalvikvm(863): Unable to resolve superclass of Landroid/support/v8/renderscript/RenderScript$2; (316)
04-04 15:37:39.146: W/dalvikvm(863): Link of class 'Landroid/support/v8/renderscript/RenderScript$2;' failed
04-04 15:37:39.146: E/dalvikvm(863): Could not find class 'android.support.v8.renderscript.RenderScript$2', referenced from method android.support.v8.renderscript.RenderScript.setErrorHandler
04-04 15:37:39.146: W/dalvikvm(863): VFY: unable to resolve new-instance 890 (Landroid/support/v8/renderscript/RenderScript$2;) in Landroid/support/v8/renderscript/RenderScript;
04-04 15:37:39.146: D/dalvikvm(863): VFY: replacing opcode 0x22 at 0x0009
04-04 15:37:39.146: D/dalvikvm(863): VFY: dead code 0x000b-0012 in Landroid/support/v8/renderscript/RenderScript;.setErrorHandler (Landroid/support/v8/renderscript/RenderScript$RSErrorHandler;)V
04-04 15:37:39.146: W/dalvikvm(863): Unable to resolve superclass of Landroid/support/v8/renderscript/RenderScript$1; (317)
04-04 15:37:39.146: W/dalvikvm(863): Link of class 'Landroid/support/v8/renderscript/RenderScript$1;' …我对RenderScript ScriptIntrinsic Blur有一些问题 - 在某些设备上它不会模糊整个图像.我缩小输入图像的尺寸并确保宽度是4的倍数(因为它是由Roman Nurik建议的:https://plus.google.com/+RomanNurik/posts/TLkVQC3M6jW)
@SuppressLint("NewApi")
private Bitmap blurRenderScript(Bitmap smallBitmap) {
    Bitmap output = Bitmap.createBitmap(smallBitmap.getWidth(), smallBitmap.getHeight(), smallBitmap.getConfig());
    RenderScript rs = RenderScript.create(getContext());
    ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
    Allocation inAlloc = Allocation.createFromBitmap(rs, smallBitmap, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_GRAPHICS_TEXTURE);
    Allocation outAlloc = Allocation.createFromBitmap(rs, output);
    script.setRadius(BLUR_RADIUS);
    script.setInput(inAlloc);
    script.forEach(outAlloc);
    outAlloc.copyTo(output);
    rs.destroy();
    MutableBitmap.delete(smallBitmap);
    return output;
}
它正在开发Nexus 4:


但在Galaxy S4上,右侧有透明边缘:


我希望你能看出我的意思 - 如果你用gimp打开图片,或者你可以更好地看到它.它不依赖于图片大小.我也尝试了越来越大的图像,结果总是一样的.例如,它也发生在Nexus 7 2012上.此外,透明工件有时位于bottem或左边缘.在此先感谢您的帮助!
Nexus 4:4.4.2/Build Number KOT49H Galaxy S4:4.2.2/Build Number JDQ39.I9505XXUDMGG
我有一个Android应用,需要一个图象,模糊的图像,去除模糊基于掩模和施加最终层(不相关)。最后两个步骤(基于蒙版消除模糊并应用最后一层)重复进行,每次使用一个新蒙版(150个蒙版)。
输出get绘制在画布(SurfaceView)上。这样,应用程序可以有效地创建具有动画模糊效果的图像视图。
所有这些图像处理步骤都是使用RenderScript实现的。
我将第1步的代码省略掉,使图片模糊,因为这与我要面对的问题无关。
我有一个自定义内核,该内核以in Allocation作为参数并包含2个全局变量,这也是Allocations。
这3个分配都使用Allocation.copyFrom(bitmap)从位图获取数据。
在这里,我还有一个自定义内核,该内核以in Allocation作为参数并包含3个全局变量,其中1是和Allocation,2是浮点数。
这些内核的工作方式与这个问题无关,但是为了确保我在下面包括了一些简化的片段。
还要注意的另一件事是,我正在遵循所有最佳实践,以确保有关分配,RenderScript和我的SurfaceView的性能达到最佳状态。
因此,可以忽略常见的错误,例如每次创建一个新的RenderScript实例,不尽可能重用Allocations。
blurMask.rs
#pragma version(1)
#pragma rs java_package_name(com.example.rs)
#pragma rs_fp_relaxed
// Extra allocations
rs_allocation allocBlur;
rs_allocation allocBlurMask;
/*
 * RenderScript kernel that performs a masked blur manipulation.
 * Blur Pseudo: out = original * blurMask + …由于我已经迁移到androidx,我无法运行Renderscript.我得到以下异常:
2018-10-12 16:27:58.328 27195-27195/pl.qus.xenoamp2 A/zygote64:java_vm_ext.cc:504] JNI在应用程序中检测到错误:JNI NewGlobalRef调用挂起异常java.lang.ClassNotFoundException:没有在路径上找到类"android.support.v8.renderscript.RenderScript":DexPathList [[zip文件"/data/app/pl.qus.xenoamp2-xHJAddeg9oM-uGSxlvMp7A==/base.apk"],nativeLibraryDirectories=[/data /app/pl.qus.xenoamp2-xHJAddeg9oM-uGSxlvMp7A==/lib/arm64,/data/app/pl.qus.xenoamp2-xHJAddeg9oM-uGSxlvMp7A==/base.apk!/lib/arm64-v8a,/ system/lib64,/ system/vendor/lib64]] 2018-10-12 16:27:58.328 27195-27195/pl.qus.xenoamp2 A/zygote64:java_vm_ext.cc:504] at java.lang.Class dalvik.system.BaseDexClassLoader java.lang上的.findClass(java.lang.String)(BaseDexClassLoader.java:93)2018-10-12 16:27:58.328 27195-27195/pl.qus.xenoamp2 A/zygote64:java_vm_ext.cc:504].类java.lang.ClassLoader.loadClass(java.lang.String,boolean)(ClassLoader.java:379)2018-10-12 16:27:58.328 27195-27195/pl.qus.xenoamp2 A/zygote6 4:java_vm_ext.cc:504] java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String)(ClassLoader.java:312)2018-10-12 16:27:58.328 27195-27195/pl .qus.xenoamp2 A/zygote64:java_vm_ext.cc:504] at java.lang.String java.lang.Runtime.nativeLoad(java.lang.String,java.lang.ClassLoader,java.lang.String)(Runtime.java : - )2018-10-12 16:27:58.328 27195-27195/pl.qus.xenoamp2 A/zygote64:java_vm_ext.cc:504] at java.lang.String java.lang.Runtime.doLoad(java.lang .string,java.lang.ClassLoader)(Runtime.java:1099)2018-10-12 16:27:58.328 27195-27195/pl.qus.xenoamp2 A/zygote64:java_vm_ext.cc:504] at void java.lang .Runtime.loadLibrary0(java.lang.ClassLoader,java.lang.String)(Runtime.java:1014)2018-10-12 16:27:58.328 27195-27195/pl.qus.xenoamp2 A/zygote64:java_vm_ext.cc void 504.在void java.lang.System.loadLibrary(java.lang.String)(System.java:1657)2018-10-12 16:27:58.328 27195-27195/pl.qus.xenoamp2 A/zygote64:java_vm_ext .cc:504]在androidx.renderscript.RenderScript androidx.renderscript .RenderScript.internalCreate(android.content.Context,int,androidx.renderscript.RenderScript $ ContextType,int)(RenderScript.java:1408)2018-10-12 16:27:58.328 27195-27195/pl.qus.xenoamp2 A/zygote64:java_vm_ext.cc:504]在androidx.renderscript.RenderScript androidx.renderscript.RenderScript.create(android.content.Context,int,androidx.renderscript.RenderScript $ ContextType,int)(RenderScript.java:1599)2018- 10-12 16:27:58.328 27195-27195/pl.qus.xenoamp2 A/zygote64:java_vm_ext.cc:504]在androidx.renderscript.RenderScript androidx.renderscript.RenderScript.create(android.content.Context,androidx.renderscript .RenderScript $ ContextType,int)(RenderScript.java:1549)2018-10-12 …
最近,我搜索有关renderscript的文章,但似乎没有.任何人都可以给我一些谈论renderscript的文章吗?
我发现在RenderScript中缺少良好的文档,因为我知道,forEach在RS中,为分配中的每个项目执行root().
我正在尝试为Renderscript创建一个图像处理库,作为一个起点,我达到了这个很好的答案.但问题在于,模糊操作在每个像素上,并且每个像素需要另一个循环(n具有模糊宽度)的计算.尽管在多核上运行,但它仍然有点太慢.
我试图修改它以允许(两次通过)盒式过滤器,但这需要处理单行或列而不是单元格.那么,有没有办法让foreach将数组发送到root()?
我在Android RenderScript示例"Fountain"中插入了一个rsDebug方法,但是我没有从logcat中获取任何消息.
这是一个代码片段,用于演示我尝试过的内容:
int root() {
    float dt = min(rsGetDt(), 0.1f);
    rsDebug("dt", dt);
    ...
}
我试图使用RenderScript支持库中的ScriptIntrinsicBlur模糊图像.我正在使用gradle,我使用这种方法来使用RenderScript的支持库版本.
在我的Nexus 4上,一切正常并且速度非常快,但是当我在搭载Android 2.3.3的三星Galaxy S上试用它时,我得到的图片看起来像这样:

我正在使用Roman Nurik的提示将位图宽度设置为4的倍数,但我不认为这是我的问题的原因.我的模糊代码看起来与这篇文章完全一样.谢谢你的建议.
这是我的代码:
获取视图的位图并重新缩放位图:
public static Bitmap loadBitmapFromView(View v) {
        v.setDrawingCacheEnabled(false);
        v.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_LOW);
        v.setDrawingCacheEnabled(true);
        Bitmap b = v.getDrawingCache();
        return b;
    }
public static Bitmap scaledBitmap(Bitmap dest, float scale) {
        int scaledWidth = (int) (scale * dest.getWidth());
        if (scaledWidth % 4 != 0) { //workaround for bug explained here https://plus.google.com/+RomanNurik/posts/TLkVQC3M6jW
            scaledWidth = (scaledWidth / 4) * 4;
        }
        return Bitmap.createScaledBitmap(dest, scaledWidth, (int) (scale * dest.getHeight()), true);
    }
Renderscript代码:
Bitmap bitmap = sentBitmap.copy(sentBitmap.getConfig(), true); …android ×10
renderscript ×10
blur ×2
3d ×1
animation ×1
artifact ×1
foreach ×1
gpu ×1
performance ×1
samsung-s8 ×1
scripting ×1
transparent ×1