Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 对renderscript的大量调用会产生错误“;创建的RS线程数少于预期数量”;_Android_Renderscript - Fatal编程技术网

Android 对renderscript的大量调用会产生错误“;创建的RS线程数少于预期数量”;

Android 对renderscript的大量调用会产生错误“;创建的RS线程数少于预期数量”;,android,renderscript,Android,Renderscript,我有一个带有旋转器的应用程序,其中有很多项目和一个图像 每次用户选择列表中的一项时,都会执行若干(1到5)个renderscript脚本来更改图像的像素 在做出大约30个选择后,应用程序因错误而崩溃 这是堆栈跟踪 03-20 13:56:59.366: ERROR/RenderScript(3405): Created fewer than expected number of RS threads. 03-20 13:57:02.990: ERROR/AndroidRuntime(3405):

我有一个带有旋转器的应用程序,其中有很多项目和一个图像

每次用户选择列表中的一项时,都会执行若干(1到5)个renderscript脚本来更改图像的像素

在做出大约30个选择后,应用程序因错误而崩溃

这是堆栈跟踪

03-20 13:56:59.366: ERROR/RenderScript(3405): Created fewer than expected number of RS threads.
03-20 13:57:02.990: ERROR/AndroidRuntime(3405): FATAL EXCEPTION: main
    java.lang.RuntimeException: createWindowSurface failed EGL_BAD_ALLOC
    at android.view.HardwareRenderer$GlRenderer.createSurface(HardwareRenderer.java:1064)
    at android.view.HardwareRenderer$GlRenderer.createEglSurface(HardwareRenderer.java:961)
    at android.view.HardwareRenderer$GlRenderer.initialize(HardwareRenderer.java:787)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1502)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
    at android.view.Choreographer.doCallbacks(Choreographer.java:562)
    at android.view.Choreographer.doFrame(Choreographer.java:532)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
    at android.os.Handler.handleCallback(Handler.java:725)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:5041)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
    at dalvik.system.NativeStart.main(Native Method)
我想我应该以某种方式关闭renderscript使用的不必要线程,或者什么

更新:

有时错误是不同的:

03-20 16:09:42.293: ERROR/bcc(24984): !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
03-20 16:09:42.293: ERROR/bcc(24984): rslAssert [frameworks/compile/linkloader/include/ELFObject.h:86] SHNCommonDataPtr && "Must init common data size before use!"
03-20 16:09:42.293: ERROR/bcc(24984): !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

更新2:

这是亮度conrast过滤器。 我认为每次创建新的输入和输出分配以及脚本对象都会占用内存。是否可以为renderscript操作链使用一个分配?例如,我从位图中进行分配,然后应用BrightnessContractFilter,然后是具有类似实现的不同过滤器

public Bitmap brightnessContrastRs(Bitmap bmIn, int brightness, int contrast, Context context)
{
    Bitmap bmOut = Bitmap.createBitmap(bmIn.getWidth(), bmIn.getHeight(),
            bmIn.getConfig());
//  RenderScript rs = RenderScript.create(context);
    Allocation allocIn;
    allocIn = Allocation.createFromBitmap(rs, bmIn,
            Allocation.MipmapControl.MIPMAP_NONE,
            Allocation.USAGE_SCRIPT);
    Allocation allocOut = Allocation.createTyped(rs, allocIn.getType());
    ScriptC_BrightnessContrast script = new ScriptC_BrightnessContrast(rs, context.getResources(),
            R.raw.brightnesscontrast);
    script.set_in(allocIn);
    allocIn.destroy();
    script.set_out(allocOut);
    script.set_script(script);
    float rowContrast = ((100.0f + contrast) * (100.0f + contrast) / 10000.0f);
    float rowBrightness = brightness / 255.f;
    script.set_rowBrightness(rowBrightness);
    script.set_rowContrast(rowContrast);
    script.invoke_filter();
    allocOut.copyTo(bmOut);
    allocOut.destroy();
    return bmOut;
}
除了在一些操作中,我还有相当大的整数数组(360000整数),正如我所理解的,每次创建scriptc对象时,它都会为renderscript中定义的每个数组分配内存,因此内存可能会很快泄漏

当我发布这个问题时,每次创建RenderScript对象的注释行都没有注释,内存泄漏得更快

该设备是Nexus4

例如,这里是带有数组的RS文件(其他文件与此类似,但可能不包含数组)

rs\u分配输出;
资源分配;
rs_脚本;
浮动不透明度;
浮动字母[360000];
整数宽度;
void root(常量uchar4*v_in,uchar4*v_out,常量void*usrData,uint32\t x,
uint32_t y)
{
浮动4电流=RS8888(*v_英寸);
当前.a=alphas[宽度*y+x]*不透明度;
*v_out=rsPackColorTo8888(电流r、电流g、电流b、电流a);
}
空过滤器()
{
#如果!已定义(RS|U版本)|(RS|U版本<14)
rsForEach(脚本、输入、输出、0);
#否则
rsForEach(脚本、输入、输出);
#恩迪夫
}

是的,每次创建一个新的ScriptC对象都需要大量内存。我将它们移动到类字段变量中,所有操作都正常。

是的,每次创建一个新的ScriptC对象都需要大量内存。我将它们移动到类字段变量中,所有操作都正常。

能否发布BrightnessContrast.rs文件,以及如何运行它?在日志中记录故障之前的几行代码也会有所帮助(并提及您正在哪个设备上运行此功能)。您可以发布您的BrightnessContrast.rs文件以及您是如何运行它的吗?在日志中记录故障之前的几行代码也会有帮助(并提及您正在哪个设备上运行此操作)。我也面临类似的问题,因此我创建了rs和脚本对象类字段变量,现在它不会崩溃,即使我更改了15-20次方向。谢谢你!在许多位图上,在活动上运行大约20次rs。在分配上调用destroy真的能提高性能吗?我没有这样做。我也面临着类似的问题,所以我创建了rs和脚本对象类字段变量,现在它不会崩溃,即使在我改变方向15-20次之后。谢谢你!在许多位图上,在活动上运行大约20次rs。在分配上调用destroy真的能提高性能吗?我不会那么做的。
        ScriptC_BrightnessContrast script = new ScriptC_BrightnessContrast(rs, context.getResources(),
            R.raw.brightnesscontrast);
public Bitmap brightnessContrastRs(Bitmap bmIn, int brightness, int contrast, Context context)
{
    Bitmap bmOut = Bitmap.createBitmap(bmIn.getWidth(), bmIn.getHeight(),
            bmIn.getConfig());
//  RenderScript rs = RenderScript.create(context);
    Allocation allocIn;
    allocIn = Allocation.createFromBitmap(rs, bmIn,
            Allocation.MipmapControl.MIPMAP_NONE,
            Allocation.USAGE_SCRIPT);
    Allocation allocOut = Allocation.createTyped(rs, allocIn.getType());
    ScriptC_BrightnessContrast script = new ScriptC_BrightnessContrast(rs, context.getResources(),
            R.raw.brightnesscontrast);
    script.set_in(allocIn);
    allocIn.destroy();
    script.set_out(allocOut);
    script.set_script(script);
    float rowContrast = ((100.0f + contrast) * (100.0f + contrast) / 10000.0f);
    float rowBrightness = brightness / 255.f;
    script.set_rowBrightness(rowBrightness);
    script.set_rowContrast(rowContrast);
    script.invoke_filter();
    allocOut.copyTo(bmOut);
    allocOut.destroy();
    return bmOut;
}
rs_allocation out;
rs_allocation in;
rs_script script;

float opacity;
float alphas[360000];
int width;

void root(const uchar4* v_in, uchar4* v_out, const void* usrData, uint32_t x,
      uint32_t y)
{
    float4 current = rsUnpackColor8888(*v_in);
    current.a = alphas[width * y + x] * opacity;
    *v_out = rsPackColorTo8888(current.r, current.g, current.b, current.a);
}
void filter()
{
 #if !defined(RS_VERSION) || (RS_VERSION < 14)
rsForEach(script, in, out, 0);
 #else
rsForEach(script, in, out);
 #endif
}