我最近才将Galaxy S7更新为Android 7.0.0,发现了一些奇怪的地方。

现在,以前可以使用的ScriptIntrinsicBlur产生了部分透明的结果。无论是在SupportLibrary版本还是本机版本上。

我追踪到它取决于模糊半径,通常情况下,半径越大,结果越不透明。

因此,我在完全不透明的图片上对半径从0到25(允许范围)的像素进行了扫描测试。

Android Emulator x86 API 24:

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


因此,这为所有半径创建了一些透明度,但并不引人注意。

Galaxy S7,API 24,内部版本: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之后才这样做:


使用本机RenderScript时,请使用CREATE_FLAG_LOW_LATENCY标志创建上下文。 RenderScript.create(ctx, RenderScript.ContextType.NORMAL, CREATE_FLAG_LOW_LATENCY)
如果使用支持库,请先致电RenderScript.forceCompat();,再致电RenderScript.create(ctx)

关于java - ScriptIntrinsicBlur在Galaxy S7的API 24上断开了?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41976829/

10-12 06:12