ScriptIntrinsicBlur 在 Galaxy S7 的 API 24 上损坏?

ScriptIntrinsicBlur broken on API 24 on Galaxy S7?

我最近刚刚将 Galaxy S7 更新到 Android 7.0.0 并发现了一些东西 st运行ge。

以前的工作 ScriptIntrinsicBlur 现在产生部分 t运行sparent 结果。 SupportLibrary 版本和本机版本。

我发现它取决于模糊半径,一般来说,半径越大,结果越不清晰。运行

所以我 运行 在完全不透明的图片上对半径从 0 到 25(允许 运行ge)像素进行扫描测试。

Android 模拟器 x86 API 24:

blurRad: 0.025 alpha: 254
...
blurRad: 25.0 alpha: 254

所以这为所有半径创建了一些 t运行sparency,但并不明显。

银河 S7,API24,版本:NRD90M.G930FXXU1DQAO:

blurRad: 0.025 alpha: 10
...
blurRad: 0.25 alpha: 110
...
blurRad: 1.0 alpha: 241

Galaxy S7 alpha over blur radius

为了完整起见,我 运行 在 API 24 的 arm64 模拟器上进行了测试,它为所有半径生成完全不透明的结果。

结果与要模糊的位图的大小及其内容无关(当然,只要源 alpha 为 255)

此外,我注意到 ScriptIntrinsicBlur 比以前慢 8-10 倍。即使在 HTC 上,我也可以用 800fps 模糊 400x400px 图像,而 Galaxy S7 (API 24) 只能达到 90-100fps。

所以问题是:有人可以重现这个吗?有解决方法吗?

在我看来,S7 上的 GPU RenderScript 驱动程序有问题。

你能试试下面的命令吗:

adb shell setprop debug.rs.default-CPU-driver 1

然后杀死你的应用程序并重新启动它。如果行为变得正常,我们确定 GPU 驱动程序有问题,至少对于某些输入图像。

如果这是真的,则有绕过 GPU 驱动程序的解决方法,只有在您的代码找到 API24 S7 后才这样做:

  1. 使用本机 RenderScript 时,使用 CREATE_FLAG_LOW_LATENCY 标志创建上下文。 RenderScript.create(ctx, RenderScript.ContextType.NORMAL, CREATE_FLAG_LOW_LATENCY)
  2. 如果使用支持库,请在调用 RenderScript.create(ctx)
  3. 之前调用 RenderScript.forceCompat();

Galaxy S7 的驱动程序存在错误。这会影响配备 Mali GPU 的 S7 手机。拥有 Adreno GPU 的用户不受影响。即将更新。