【问题标题】:Renderscript blur warnings渲染脚本模糊警告
【发布时间】:2014-05-28 18:37:38
【问题描述】:

我使用 Google 提供的渲染脚本支持库来模糊位图。它可以工作,但我在日志上看到一个错误:

V/RenderScript_jni(20699): RS native mode
V/RenderScript(20699): 0x2a709a80 Launching thread(s), CPUs 4
W/Adreno-RS(20699): <rsdVendorAllocationDestroyQCOM:199>: rsdVendorAllocationDestroy: No context!
E/RenderScript(20699): Successfully loaded runtime: libRSDriver_adreno.so
W/Adreno-RS(20699): <rsdVendorAllocationSetupTexture:647>: ERROR: Runtime texture creation failed err: -30 image: 0x0 alloc: 0x82340000
W/Adreno-RS(20699): <rsdVendorAllocationSetupTexture:649>: ERROR: Runtime texture creation failed type: 8 kind: 11 eleSize: 4
W/Adreno-RS(20699): <rsdVendorAllocationSetupTexture:647>: ERROR: Runtime texture creation failed err: -30 image: 0x0 alloc: 0x93570000
W/Adreno-RS(20699): <rsdVendorAllocationSetupTexture:649>: ERROR: Runtime texture creation failed type: 8 kind: 11 eleSize: 4

问题是在错误之后调用垃圾收集,冻结 UI 线程一段时间。

我使用这段代码来模糊位图:

final RenderScript rs = RenderScript.create(context); //context IS NOT null
final Allocation input = Allocation.createFromBitmap(rs, original, 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(radius /* e.g. 3.f */);
script.setInput(input);
script.forEach(output);
Bitmap ret = original.copy(original.getConfig(), true);
output.copyTo(ret);

为什么会出现No context! 错误?我怎样才能避免这种情况?

PS:我使用 Nexus 5 进行测试

【问题讨论】:

    标签: android bitmap renderscript


    【解决方案1】:

    我对我之前的答案被删除感到有些失望,因为观察结果清楚地指出了错误行为,并且它们允许更多人帮助查明错误本身。

    不过,我自己调查得更彻底。我已经创建了宽度和高度在 350 到 450 之间的所有大小的位图。对于这些位图中的每一个,我都创建了一个分配。 在 Nexus 5 上,Allocation.createFromBitmap 方法总是给出以下错误,以防(bitmap width % 8) == 1、2、3 或 4。在所有其他情况下,分配都没有错误地完成。

    07-31 18:48:07.902: D/Allocation(20508): Width: 417, height: 399
    07-31 18:48:07.922: W/Adreno-RS(20508): <rsdVendorAllocationSetupTexture:647>: ERROR: Runtime texture creation failed err: -30 image: 0x0 alloc: 0x9dd20000
    07-31 18:48:07.922: W/Adreno-RS(20508): <rsdVendorAllocationSetupTexture:649>: ERROR: Runtime texture creation failed type: 8 kind: 11 eleSize: 4
    

    我怀疑一个错误,但我找不到任何与rsdVendorAllocationSetupTexture 相关的源代码来深入挖掘。 我不知道错误是否有影响...(请参阅下面的注释了解可能的影响...例如以一维方式使用分配时)

    可以通过选择位图的宽度使宽度 % 8 == 5、6、7 或 0 绕过此错误。

    我之前的回答被删除了:

    我在 Nexus 5 上遇到了完全相同的问题,我注意到了一些额外的问题:

    • 我只有纵向位图的纹理创建失败错误。方形位图或横向位图不会触发这些错误。
    • 我总是遇到无上下文错误(纵向和横向位图)
    • 尽管我收到纵向位图的错误,但渲染脚本的处理和结果都很好(另请参阅接下来的 2 点)。
    • 当我通过一维方法 rsGet(Set)ElementAt_uchar4(gIn,location) 访问渲染脚本中的分配时,在给定位图的宽度和高度的情况下计算位置时,渲染脚本的结果对于纵向形状的位图来说是混乱的。
    • 当我通过二维方法rsGet(Set)ElementAt_uchar4(gIn,x,y)访问分配时,我仍然得到纵向位图的错误,但渲染脚本的结果很好。
    • 对于一个混乱的结果,我的意思是结果(模糊)仍然可以识别,但它被扭曲了。
    • 我也确定我没有使用回收的位图。
    • 该脚本也是一个模糊脚本,但不是固有脚本。 (https://github.com/kikoso/android-stackblur)(不是我自己写的)...当我注意到纵向位图没有正确模糊时,我通过尝试调试注意到了上述主题。

    【讨论】:

    • 嗯,你的第一个答案不是一个,这就是它被标记的原因。这个比较像。
    【解决方案2】:

    我有同样的错误,因为我使用了回收的位图。检查您的original 位图是否未被回收。

    【讨论】:

    • 这似乎不能解决我的问题。在使用 android.support.v8 支持库时,我没有回收位图,但在 Nexus 5 上仍然出现错误。
    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 2016-10-21
    • 1970-01-01
    相关资源
    最近更新 更多