L'opération de masse sur le GPU bloque le rendu des nouvelles images. Il est difficile de résoudre ce problème et il n'a en fait rien à voir avec la SNPE, car nous pouvons reproduire ce problème en utilisant une implémentation non-SNPE (cadre interne basé sur OpenCL). Vous pouvez simplement modifier le placement des opérations tensorielles pour atténuer ce problème. Par exemple, vous pouvez effectuer le calcul sur le CPU (par exemple : tensorflow mobile), et l'interface utilisateur peut être rendue correctement tout en étant beaucoup plus lente et gourmande en CPU.
Il est possible de visualiser mon explication par les options du développeur sur l'appareil. Pour plus d'informations, suivez ce lien : https://developer.Android.com/studio/profile/inspect-gpu-rendering#profile_rendering . Vous pourrez voir que plusieurs "Tampon d'échange" 1 les opérations pourraient prendre des intervalles anormalement longs.
La meilleure solution est de faire le calcul sur un DSP avec un réseau quantifié, mais il y a de nombreuses limitations sur les opérateurs disponibles et la mémoire.
Il est possible qu'Android 8.1 puisse résoudre ces problèmes grâce à l'abstraction NN-API et à la programmation au niveau du système d'exploitation des ressources GPU, mais je n'en attendrais pas trop de Google.
BTW : J'ai un schéma hypothétique pour atténuer ce problème en fragmentant les opérations de masse. En théorie, si le worker-thread dormait pendant 20 ms entre les opérations inférieures à 50 ms afin que le thread de l'interface utilisateur puisse effectuer le rendu correctement, l'expérience utilisateur devrait être tolérable puisque le FPS pourrait être maintenu au-dessus de 15. Nous allons essayer ce schéma parce que ce schéma handicapé devrait quand même être beaucoup plus rapide que les schémas basés sur le CPU.