我最近才将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/