我似乎找不到任何关于如何检查 RenderScript 是否真正并行化代码的文档。我想知道是否正在使用 CPU 或 GPU 以及调度的线程数。
我唯一发现的是这个错误报告:http : //code.google.com/p/android/issues/detail?id=28662
作者提到将 rsForEach 放在脚本中导致它通过指向以下调试输出而被序列化:
01-02 00:21:59.960: D/RenderScript(1256): = 0 0x0
01-02 00:21:59.976: D/RenderScript(1256): = 1 0x1
Run Code Online (Sandbox Code Playgroud)
我尝试在 LogCat 中搜索类似的字符串,但找不到匹配项。
有什么想法吗?
更新:其实我似乎已经想通了。似乎我的 LogCat foo 没有应有的好。我通过我的应用程序信息过滤了调试输出,发现一行是这样的:
02-26 22:30:05.657: V/RenderScript(26113): rsContextCreate dev=0x5cec0458
02-26 22:30:05.735: V/RenderScript(26113): 0x5d9f63b8 Launching thread(s), CPUs 2
Run Code Online (Sandbox Code Playgroud) 我在应用程序中使用 RenderScript 来执行多项图像处理任务。
有时,我会随机得到以下异常:
10-10 15:27:04.479: E/AndroidRuntime(2113): FATAL EXCEPTION: FinalizerWatchdogDaemon
10-10 15:27:04.479: E/AndroidRuntime(2113): java.util.concurrent.TimeoutException: android.renderscript.Type.finalize() timed out after 10 seconds
10-10 15:27:04.479: E/AndroidRuntime(2113): at android.renderscript.RenderScript.nObjDestroy(RenderScript.java:216)
10-10 15:27:04.479: E/AndroidRuntime(2113): at android.renderscript.BaseObj.finalize(BaseObj.java:116)
10-10 15:27:04.479: E/AndroidRuntime(2113): at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:187)
10-10 15:27:04.479: E/AndroidRuntime(2113): at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:170)
10-10 15:27:04.479: E/AndroidRuntime(2113): at java.lang.Thread.run(Thread.java:856)
Run Code Online (Sandbox Code Playgroud)
我的所有 RenderScript 调用都包含在信号量中,以防止同一脚本并行运行。谁能告诉我这条消息的含义以及如何防止它?
最近,我发现渲染脚本是 Android 上图像处理的更好选择。表演很精彩。但关于它的文献并不多。我想知道是否可以通过渲染脚本将多张照片合并为结果照片。
http://developer.android.com/guide/topics/renderscript/compute.html说:
内核可能有输入
Allocation、输出Allocation或两者都有。一个内核不能有超过一个输入或一个输出Allocation。如果需要多个输入或输出,这些对象应绑定到脚本全局变量,并通过或rs_allocation从内核或可调用函数访问。rsGetElementAt_type()rsSetElementAt_type()
这个问题有代码示例吗?
我正在研究使用Renderscript在大型复杂输入数组上执行FFT.FFT是相当标准的,因为它涉及三个循环,但内循环执行FFT中蝶形运算.因为每个butterfly使用数组的不同部分,所以没有一种明显的简单方法来分区输入分配中的元素.
所以,我的两个问题是:
我在C中有工作代码,但还没有开始实现renderscript版本,所以没有任何代码可以发布.
在此先感谢您的帮助.
我正在尝试对传入的预览相机帧应用 2D 傅立叶变换。所以这是我在每个上执行的 renderScript 代码onSurfaceTextureUpdated:
#pragma version(1)
#pragma rs java_package_name(foo.camerarealtimefilters)
rs_allocation inPixels;
int height;
int width;
void root(const uchar4 *in, uchar4 *out, uint32_t x, uint32_t y) {
float3 fourierPixel;
for(int k=0; k<=width; k++){
for(int l=0; l<=height; l++){
float3 pixel = convert_float4(rsGetElementAt_uchar4(inPixels, k, l)).rgb;
float greyOrigPixel = (pixel.r + pixel.g + pixel.b)/3;
float angle = 2 * M_PI * ( ((x * k) / width) + ((y * l) / height) );
fourierPixel.rgb = greyOrigPixel*cos(angle);
};
};
out->xyz = …Run Code Online (Sandbox Code Playgroud) 使用滑动android库我将图像作为位图(参见滑动文档),然后我尝试使用renderscript和ScriptIntrinsicBlur模糊位图,这是一个高斯模糊.(取自此stackoverflow帖子)
Glide.with(getApplicationContext())
.load(ImageUrl)
.asBitmap()
.into(new SimpleTarget<Bitmap>(300,200) {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) {
RenderScript rs = RenderScript.create(mContext); // context = this. this referring to the activity
final Allocation input = Allocation.createFromBitmap( rs, resource, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT );
final Allocation output = Allocation.createTyped( rs, input.getType() );
final ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create( rs, Element.U8_4( rs ) );
script.setRadius(8f);
script.setInput(input);
script.forEach(output);
output.copyTo(resource);
mImageView.setImageBitmap(resource);
}
});
Run Code Online (Sandbox Code Playgroud)
任何帮助将非常感谢谢谢.:)
这个问题是在我使用现有的 RenderScript 项目将 Android Studio 从 2.1.2 更新到 2.3.3 之后开始的。我得到的错误信息是:
错误:任务“:app:mergeDebugResources”的执行失败。
错误:java.io.FileNotFoundException:C:\<项目位置>\app\build\generated\res\rs\debug\raw\bc64(访问被拒绝)
该项目来自 Android Studio 2.1.2,后来由 2.3.3 打开。没有提示版本号不正确,所以它应该可以正常工作。但是现在我无法在移动设备上运行/调试应用程序。
当我尝试在启用 RenderScript 的情况下创建一个新的空白屏幕项目时,它能够运行/调试。
怎么解决?
我计划从 ABI 拆分迁移到 App Bundle 功能。目前我正在使用此代码:
def versionCodesAbi = ['x86': 1, 'x86_64': 2, 'armeabi-v7a': 3, 'arm64-v8a': 4]
splits {
abi {
enable true
reset()
include "x86", "x86_64", "armeabi-v7a", "arm64-v8a"
// "armeabi", "mips", "mips64" last three not needed and not supported currently
universalApk true
}
}
android.applicationVariants.all { variant ->
variant.outputs.each { output ->
def abi = versionCodesAbi.get(output.getFilter(OutputFile.ABI))
if (abi != null) {
output.versionCodeOverride =
abi * 1000 + variant.versionCode
}
}
}
Run Code Online (Sandbox Code Playgroud)
每个 ABI 提供 4 个 APK(+ 通用一个)。使用此代码的原因是为了减少应用程序的大小,因为PanoWidget …
对于视频图像处理项目,我必须旋转传入的 YUV 图像数据,以便数据不是水平显示而是垂直显示。我使用了这个项目,它让我深入了解了如何将 YUV 图像数据转换为 ARGB 以实时处理它们。该项目的唯一缺点是它仅在景观中。没有纵向模式选项(我不知道为什么 Google 的人提供了一个仅处理横向的示例示例)。我想改变这一点。
因此,我决定使用自定义的 YUV 转 RGB 脚本来旋转数据,使其以纵向模式显示。以下 GIF 演示了应用程序如何在我应用任何旋转之前显示数据。
你必须知道,在 Android 中,即使设备处于纵向模式,YUV 图像数据也会以横向呈现(我在开始这个项目之前不知道。同样,我不明白为什么没有可用的方法可用于通过一次调用来旋转帧)。这意味着即使设备处于纵向模式,起点也在左下角。但是在纵向模式下,每一帧的起点应该在左上角。我对字段使用矩阵表示法(例如 (0,0)、(0,1) 等)。注意:我从这里拿了草图:

要旋转横向框架,我们必须重新组织字段。这是我对草图(见上文)所做的映射,它显示了yuv_420横向模式下的单个帧。映射应将框架旋转 90 度:
first column starting from the bottom-left corner and going upwards:
(0,0) -> (0,5) // (0,0) should be at (0,5)
(0,1) -> (1,5) // (0,1) should be at (1,5)
(0,2) -> (2,5) // and so on ..
(0,3) -> (3,5)
(0,4) -> (4,5)
(0,5) -> (5,5)
2nd column starting at …Run Code Online (Sandbox Code Playgroud) 100% 的崩溃发生在 android 11 上,96% 的崩溃发生在三星设备上。我删除了 renderscript 的所有实例,但此崩溃仍在发生,因此可能是我的依赖项之一。
我发现这在 note4上有 android.renderscript.RSRuntimeException ,它说 4097 意味着致命的驱动程序错误,但没有提供有关如何修复它的任何详细信息。
有谁知道我如何解决这个崩溃?
更新:当我在我的应用程序中搜索“renderscript”时,除非我把它放在范围内然后有一堆对它的引用,否则什么都不会出现。我不明白他们来自哪里

更新:明确地说,我已经从我的应用程序中删除了对 renderscript 的所有引用,但似乎我的一个或多个依赖项仍在使用它。我需要帮助隔离这些依赖项。一个叫做 android-30 的东西正在使用渲染脚本。这是 api 30 库还是什么?然后称为 support/v8 的东西正在使用渲染脚本。这是支持库吗?(我确实启用了支持库)