2016-08-19 5 views
0

Je travaille sur une application iPad qui a un dessin personnalisé UIView qui couvre essentiellement tout l'écran. C'est une application audio et il y a des VU-mètres qui reçoivent des messages de mise à jour sur ethernet environ 30 fois par seconde, puis demandent à l'interface utilisateur de redessiner les VU-mètres sur l'écran. Le problème que j'ai est qu'il ya 16 VU mètres à différentes positions dans la vue et je finis par appeler needsDisplayInRect pour chacun 30 fois par seconde. Si je fais tout le dessin dans la fonction drawRect alors ça marche, mais c'est assez lent car le CGRect passé à drawRect est presque tout l'écran.Gérer des appels multiples/fréquents à UIView nécessite DisplayDisplayInRect efficacement

Dans la version OSX, il y a la fonction NSViewgetRectsBeingDrawn qui m'a permis d'améliorer de manière significative les performances de rafraîchissement. Cependant, autant que je sache, il n'y a pas de fonction équivalente dans iOS.

J'ai essayé le stockage CGRects que je l'ai appelé alors que les redessiner à drawRect, mais il se trouve que iOS décide souvent de redessiner les zones entre les CGRects qui ont eu needsDisplayInRect leur a demandé, donc je finis avec de gros rectangles blancs sur des zones que je n'ai pas demandé de redessiner (bien que j'obtienne l'amélioration de performance que j'attends). Le problème ici est que je ne peux pas voir un moyen d'obtenir les retraits qui sont en train d'être redessinés, juste le rect passé dans drawRect qui est essentiellement une union de tous les rects étant redessiné.

Alors, y a-t-il un autre moyen d'accélérer les retraits très fréquents de petites zones d'un UIView que j'ai manqué?

Répondre

1

La solution la plus simple est presque certainement de faire une sous-vue pour chaque VU-mètre. Vraisemblablement, vous auriez juste une classe VUMeterView et en créeriez seize instances.