2017-02-01 1 views
1

J'ai récemment obtenu la mise à jour pour le Galaxy S7 à Android 7.0.0 et découvert quelque chose d'étrange.ScriptIntrinsicBlur cassé sur API 24 sur Galaxy S7?

Le ScriptIntrinsicBlur de travail précédent produisait maintenant des résultats partiellement transparents. Les deux sur la version de SupportLibrary ainsi que le natif. Je l'ai dépisté pour dépendre du rayon de flou, où, en général, plus le rayon est grand, moins le résultat est transparent. J'ai donc effectué un test de balayage sur un rayon de 0 à 25 pixels (plage autorisée) sur une image complètement opaque.

Android Emulator API x86 24:

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

Donc cela crée une certaine transparence pour tous les rayons, mais ne se remarque pas.

Galaxy S7, API 24, Construire: NRD90M.G930FXXU1DQAO:

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

Galaxy S7 alpha over blur radius

Pour être complet, je courais le test sur un émulateur de arm64 avec l'API 24, il génère des résultats complètement opaques pour tous les rayons .

Les résultats sont indépendants de la taille du bitmap à brouiller, et de son contenu (tant que l'alpha source est bien sûr 255)

De plus je remarquai que la ScriptIntrinsicBlur est ~ 8-10 fois plus lent qu'avant. Même sur un HTC, je peux flouter une image 400x400px avec 800fps alors que le Galaxy S7 (API 24) n'atteint que 90-100fps. Donc, la question: Quelqu'un peut-il reproduire cela et existe-t-il une solution de contournement?

Répondre

1

Il me semble que quelque chose ne va pas avec le pilote GPU RenderScript sur S7.

Pouvez-vous essayer la commande suivante:

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

Et puis vous tuer l'application et redémarrez-le. Si le comportement devient normal, nous sommes sûrs que quelque chose ne va pas avec le pilote GPU, au moins pour certaines images d'entrée.

Si cela est vrai, il y a solution de contournement pour contourner le pilote GPU, ne le faites après votre code trouvé S7 API24:

  1. Lorsque vous utilisez renderScript natif, créez le contexte avec CREATE_FLAG_LOW_LATENCY drapeau. RenderScript.create(ctx, RenderScript.ContextType.NORMAL, CREATE_FLAG_LOW_LATENCY)
  2. Si vous utilisez une bibliothèque, un appel RenderScript.forceCompat(); avant d'appeler RenderScript.create(ctx)
+0

Pour comparaison: image 400x400px. Natif: 98fps et alpha cassé, RenderScript.forceCompat(): 268fps et alpha travaillant, RenderScript.create (..., CREATE_FLAG_LOW_LATENCY): 497fps, alpha fonctionnant, setprop par défaut-CPU-driver 1 avec le soutien RS: 330fps alpha fonctionnant, setprop par défaut-CPU-driver 1 avec le natif RS: 305fps –

3

Il y a un bogue dans le pilote de la Galaxy S7. Cela affecte les téléphones S7 avec les GPU maliens. Ceux avec des GPU Adreno ne sont pas affectés. Une mise à jour est à venir.

+0

Merci - y at-il une source officielle d'où vous avez obtenu ceci informations ou avez-vous trouvé par vous-même? –