所以Android 3.0(蜂窝)现在已经推出,并拥有一种名为Renderscript的新硬件加速3D图形引擎.
Renderscript 3D图形引擎
Renderscript是一个运行时3D框架,它既可以提供用于构建3D场景的API,也可以提供与平台无关的特殊着色器语言,以获得最佳性能.使用Renderscript,您可以加速图形操作和数据处理.Renderscript是为应用程序,壁纸,旋转木马等创建高性能3D效果的理想方式.
根据这篇可追溯到2009年的博客文章,这个图形引擎已经可以在名为Fountain的类中使用(甚至在蜂窝之前).最后一条线索对我很有帮助,因为现在我可以在Honeycomb代码中轻松找到该类名.
你们中的任何人都可以提供更多有关Renderscript的见解吗?以及如何更多地了解如何使用它?既然这已成为一个公共api,我假设知情人士可以获得自由谈论它的许可(我希望).
我正在编写 android 渲染脚本代码,它需要背靠背的内核调用(有时一个内核的输出成为另一个内核的输入)。我还有一些全局指针,从 Java 层绑定到内存。每个内核更新这些全局指针并输出一些东西。我必须确保在 kernel2 开始执行之前已完成 kernel1 的执行。
我查看了 android renderscript 文档,但无法很好地理解 syncAll(Usage) 和 finish()。谁能澄清如何实现这种行为?
谢谢
mScript.forEach_kernel1(mColorImageAllocation, tempAlloc);
// make sure kernel1 finishes, from android rs doc, copyTo should block
tempAlloc.copyTo(testOutputBitmap);
for (short i = 0; i < NUM_DIST; i++) {
mScript.set_gCurrentDistanceIndex(i);
mScript.forEach_kernel2(tempAlloc);
mRS.finish(); // wait till kernel2 finishes
}
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,在 kernel1 的输出上使用不同的全局参数调用相同的 kernel2。
我正在尝试模糊我的图像,并使用RenderScript在RelativeLayout的背景上显示模糊,应用程序在模拟器中工作,但手机中的应用程序不断崩溃,出现此错误:
08-05 22:21:36.543:E/RenderScript_jni(11549):无GC方法08-05 22:21:36.553:D/dalvikvm(11549):在/system/lib/libRSSupport.so 0x41803ab8中找不到JNI_OnLoad,跳过init 08-05 22:21:36.557:E/dalvikvm(11549):错误:找不到本地方法08-05 22:21:36.557:E/dalvikvm(11549):请求:Landroid/support/v8/renderscript /RenderScript; ._nInit :() V 08-05 22:21:36.558:E/JNIHelp(11549):RegisterNatives因'android/support/v8/renderscript/RenderScript'失败,中止08-05 22:21:36.558: A/libc(11549):0xdeadbaad(代码= 1),线程11549(m.example.login)的致命信号11(SIGSEGV)
这是我在单独的类上的模糊代码:
import android.content.Context;
import android.graphics.Bitmap;
import android.support.v8.renderscript.*;
public class Blur {
public static Bitmap blurBitmap(Context context, Bitmap src) {
Bitmap outBitmap = src.copy(src.getConfig(), true);
final RenderScript rs = RenderScript.create(context);
final Allocation input = Allocation.createFromBitmap(rs, src);
final Allocation output = Allocation.createFromBitmap(rs, outBitmap);
final ScriptIntrinsicBlur script =
ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
script.setRadius(25f);
script.setInput(input);
script.forEach(output);
output.copyTo(outBitmap);
rs.destroy();
return outBitmap;
}
}
Run Code Online (Sandbox Code Playgroud)
这里是MainActivity中的ny代码(我从图库中获取位图):
Uri selectedImageUri = data.getData();
Blur blur …Run Code Online (Sandbox Code Playgroud) 我在Android上通过Renderscript制作了3种模糊的位图.使用app很多次后,它会自动关闭.记录如下:
V/RenderScript(4548):用户支持的分配失败了步幅要求,回退到单独的分配
D/dalvikvm(4548):GC_EXPLICIT释放1K,5%释放21256K/22352K,暂停1ms + 4ms,总共20ms
在清单文件中启用了largeHeap,但它没有帮助.我需要通过renderscript在GPU中清除内存不是吗?我没有找到如何做到这一点.
Android操作系统:4.4.2,设备:Samsung Note II.
有谁知道如何处理这个?
我想从RenderScript中的一个Allocation访问更多元素.我们来自Google的示例代码:
uchar4 __attribute__((kernel)) invert(uchar4 in, uint32_t x, uint32_t y) {
uchar4 out = in;
out.r = 255 - in.r;
out.g = 255 - in.g;
out.b = 255 - in.b;
return out;
}
Run Code Online (Sandbox Code Playgroud)
它需要一个uchar4,谁是分配的一个元素.是否可以访问和操作多个元素?就像展开一个循环一样,例如,来自Bitmap的8个像素.
谢谢.
我知道Proguard(当minifyenabeled设置为true时)会支持Java代码,但是Renderscript脚本呢?有谁知道吗?谢谢.
我发现谷歌关于RenderScript的文档有更新(https://developer.android.com/guide/topics/renderscript/compute.html).所以我用它的代码来测试,但是有一个错误
Error:(31, 23) error: implicit declaration of function 'rsCreateAllocation_uchar4' is invalid in C99
Error:(31, 17) error: initializing 'rs_allocation' (aka 'struct rs_allocation') with an expression of incompatible type 'int'
Run Code Online (Sandbox Code Playgroud)
那是代码:
rs_allocation tmp = rsCreateAllocation_uchar4(imageWidth, imageHeight);
rsForEach(invert, inputImage, tmp);
rsForEach(greyscale, tmp, outputImage);
Run Code Online (Sandbox Code Playgroud)
所以我想知道:1:为什么会发生这种情况(我认为sdk api是原因,但我已将AS,SDK和sdk工具更新到最新版本)?2:有什么区别
uchar4 RS_KERNEL root(uchr4 in, unit32_t x, uint32_t y)
Run Code Online (Sandbox Code Playgroud)
和
void RS_KERNEL root(uchr4* in, uchar4* out, unit32_t x, uint32_t y)
Run Code Online (Sandbox Code Playgroud)
我认为第二种方法更快?!但我不能确定.并且使用指针作为params的方法用于未命名为root()的函数(我测试它).如果带有指针参数的方法更快,我如何在RS文件中使用2个或更多内核函数?
我在项目中使用的是Android DS-Photo-Editor-SDK v1.5(“ ds-photo-editor-sdk-v6.aar”)和androidx。打开编辑器过滤器时出现以下错误:
2018-10-26 19:36:27.949 16826-16898/com.levionsoftware.photos E/software.photo: ----- class 'Landroidx/renderscript/RenderScript;' cl=0x16f0d598 -----
2018-10-26 19:36:27.951 16826-16898/com.levionsoftware.photos E/software.photo: objectSize=492 (172 from super)
2018-10-26 19:36:27.951 16826-16898/com.levionsoftware.photos E/software.photo: access=0x8008.0001
2018-10-26 19:36:27.951 16826-16898/com.levionsoftware.photos E/software.photo: super='java.lang.Class<java.lang.Object>' (cl=0x0)
2018-10-26 19:36:27.951 16826-16898/com.levionsoftware.photos E/software.photo: vtable (71 entries, 11 in super):
2018-10-26 19:36:27.951 16826-16898/com.levionsoftware.photos E/software.photo: 0: long androidx.renderscript.RenderScript.a(int, long, boolean)
2018-10-26 19:36:27.951 16826-16898/com.levionsoftware.photos E/software.photo: 1: long androidx.renderscript.RenderScript.a(long, int, int, int)
2018-10-26 19:36:27.951 16826-16898/com.levionsoftware.photos E/software.photo: 2: long androidx.renderscript.RenderScript.a(long, int, int, int, java.lang.String)
2018-10-26 19:36:27.951 16826-16898/com.levionsoftware.photos E/software.photo: 3: long androidx.renderscript.RenderScript.a(long, …Run Code Online (Sandbox Code Playgroud) 只是查看renderscript的源代码.我想我在第36行发现了一个错误
private static final boolean LOG_ENABLED = DEBUG ? Config.LOGD : Config.LOGV;
Run Code Online (Sandbox Code Playgroud)
认为需要是双倍的==但没有足够的编码经验才能确定.
我想执行需要相邻像素的图像处理操作,但我不确定如何从分配中访问它们.我见过的大多数内核都在单个像素上运行,更新它,然后返回它.有没有办法可以在下面的方法中访问(x,y)的邻居.
uchar4 __attribute__((kernel)) invert(uchar4 in, uint32_t x, uint32_t y) {
uchar4 neighbor = allocation[x+1][y]; // How do I do this in renderscript?
uchar4 otherNeighbor = allocation[x-1][y];
...
}
Run Code Online (Sandbox Code Playgroud) 我拼命想在Android Studio中设置RenderScript.根据本手册http://developer.android.com/guide/topics/renderscript/compute.html#ide-setup我设置了最高可用的renderscriptTargetApi 22和renderscriptSupportModeEnabled为true.我使用buildToolsVersion"22.0.1".有了这个,我可以使用ScriptIntrinsic函数 - 但没有实现编译自编写的RenderScript(尝试20h +现在......).我总是遇到与R-File(红色)相同的问题 - 最迟当我尝试重建项目时.我究竟做错了什么?非常感谢您的帮助.