2016-02-04 3 views
2

J'essaie de déterminer (à moins de 1 ms) quand des retournements d'écran particuliers se produisent sur Android. Le chorégraphe se déclenche chaque fois qu'un cadre est retourné, mais ne permet pas de déterminer quel cadre est réellement affiché. Selon https://source.android.com/devices/graphics/architecture.html, il y a plusieurs couches dans le processus: le tampon de l'utilisateur, qui retourne à une file d'attente à triple tampon, qui retourne au déflecteur de surface, qui retourne au matériel. Chacune de ces couches peut potentiellement laisser tomber une trame, mais à ce stade, j'ai seulement déterminé comment surveiller la mémoire tampon de l'utilisateur. Existe-t-il un moyen de surveiller les autres tampons/retournements (en temps réel, sur un téléphone non-root, non personnalisé)?Déterminer les temps de retournement d'écran exact sur Android

J'ai observé des retards de trame inattendus sur le HTC M8 (environ 1 toutes les 5 minutes), mais le Nexus 7 ne semble pas avoir ce problème. Je mesure les retards en utilisant un Cedrus StimTracker (http://cedrus.com/stimtracker/) avec un capteur photo et le Lab Streaming Layer (https://github.com/sccn/labstreaminglayer). J'ai essayé d'utiliser eglPresentationTimeANDROID pour contrôler quand les écrans sont retournés, et cela n'a pas résolu le problème. Notez que j'utilise le ndk, mais je peux généralement utiliser l'interface JNI pour accéder aux fonctionnalités non ndk lorsque j'en ai besoin.

La raison pour laquelle je me soucie est d'utiliser Android pour les expériences psychologiques et neurologiques, où la précision de 1 ms est hautement souhaitable.

Répondre

2

En ce qui concerne les API accessibles, il semble que vous ayez trouvé les éléments pertinents. Si vous ne l'avez pas encore fait, veuillez lire le this stackoverflow item. En utilisant Chorégraphe et l'extrapolation, vous pouvez deviner quand la prochaine actualisation de l'affichage se produira. En utilisant eglPresentationTimeANDROID() sur un appareil Android 5.0+, vous pouvez indiquer à SurfaceFlinger quand vous voulez qu'un cadre particulier soit envoyé à l'écran. En supposant que SurfaceFlinger comptabilise correctement toute la latence (comme les trames supplémentaires ajoutées par des panneaux "intelligents"), cela devrait vous permettre d'avoir un timing fiable.

(Gardez à l'esprit que le moment est basé sur lorsque l'écran se verrouille l'image suivante, pas quand le prochain cadre est entièrement visible sur l'écran ... le temps d'attente, il dépendra du panneau.)

Grafika's "échange planifié" L'activité utilise cette fonctionnalité, mais vous semblez déjà familier. La seule façon d'être signalé par l'écran lors de l'échange est d'afficher dup() la fence d'affichage-retrait fd de l'image précédente et de l'attendre. Une partie du code dans SurfaceFlinger fait cela, notamment DispSync surveille les clôtures pour voir si le logiciel "VSYNC" dérive. Il n'y a pas d'API publique pour les clôtures, et le temps de réponse de l'espace utilisateur pourrait certainement être supérieur à 1ms de toute façon ... il est généralement préférable de planifier à l'avance que de réagir. Votre exigence pour les périphériques non personnalisés non rootés rend cela problématique.

Si vous observez généralement un comportement correct, mais que vous remarquez parfois un échec, le mieux est d'utiliser systrace pour en rechercher la cause.

+0

Merci Fadden. "Utiliser Choregorapher et extrapolation .... En utilisant eglPresentationTimeANDROID() .... cela devrait vous donner un timing fiable." C'est le test que j'ai fait. Malheureusement, il n'a pas abouti à un timing fiable sur le HTC M8. La latence typique change avec des valeurs d'extrapolation croissantes, donc je sais que j'utilise la fonction correctement. Malheureusement, systrace ne fonctionne pas sur le HTC M8. Voir http://stackoverflow.com/questions/32185412/unable-to-systrace-on-htc-one-m8-lollipop. Sans plus d'outils, nous pourrions avoir à mettre le HTC M8 sur une liste non recommandée pour la science. –

+1

Chaque appareil Android est un flocon de neige spécial. Avec vos exigences, il pourrait être plus sûr de créer une liste blanche.Si vous êtes particulièrement motivé, vous pourrez peut-être rooter le M8 et installer un noyau activé par systrace, mais il y a une chance que vous remplaciez le composant qui cause l'instabilité, ce qui serait génial pour ce périphérique mais un peu vaincu le but. – fadden