J'ai deviné que vous faites cela pour afficher une partie d'une image sur l'écran, parce que vous avez mentionné UIImageView
. Et les problèmes d'optimisation toujours besoin de définir plus précisément.
Confiance à Apple pour Régulière des éléments d'INTERFACE utilisateur
En fait, UIImageView
avec clipsToBounds
est l'un de la manière la plus rapide/la plus simple des façons d'archiver votre but si votre objectif est simplement couper une zone rectangulaire d'une image (pas trop gros). Aussi, vous n'avez pas besoin d'envoyer de l' setNeedsDisplay
message.
Ou vous pouvez essayer de mettre la UIImageView
à l'intérieur d'un vide UIView
et set clipping au conteneur de vue. Avec cette technique, vous pouvez transformer votre image librement par le paramètre transform
de la propriété en 2D (mise à l'échelle, rotation, translation).
Si vous avez besoin de transformation 3D, vous pouvez toujours utiliser CALayer
avec masksToBounds
de la propriété, mais à l'aide de CALayer
vous donnera de très peu de performances supplémentaires habituellement ne pas considérable.
De toute façon, vous avez besoin de connaitre tous les détails de bas niveau pour les utiliser correctement pour l'optimisation.
Pourquoi est-ce que l'un des moyens les plus rapides?
UIView
est juste une fine couche sur le dessus de l' CALayer
qui est appliqué sur le dessus de l'OpenGL qui est pratiquement une interface directe avec le GPU. Cela signifie UIKit est accéléré par GPU.
Donc, si vous les utilisez correctement (je veux dire, à l'intérieur conçu limites), il effectuera ainsi que simple OpenGL
mise en œuvre. Si vous utilisez seulement un peu d'images à afficher, vous obtiendrez des performances acceptables avec UIView
mise en œuvre, car il peut faire plein de l'accélération de la sous-jacentes OpenGL (qui signifie l'accélération GPU).
De toute façon si vous avez besoin extrême d'optimisation pour des centaines d'animation des sprites avec finement réglé pixel shaders comme dans un jeu de l'app, vous devriez vous utiliser OpenGL directement, car CALayer
manque beaucoup d'options pour l'optimisation des niveaux inférieurs. De toute façon, au moins pour l'optimisation des trucs de l'INTERFACE utilisateur, il est incroyablement difficile d'être mieux qu'Apple.
Pourquoi votre méthode est plus lente que UIImageView
?
Ce que vous devez savoir, c'est tout au sujet de l'accélération GPU. Dans tous les derniers ordinateurs, des graphiques rapides performances qu'avec le GPU. Ensuite, le point est de savoir si la méthode que vous utilisez est mis en œuvre sur le dessus de la carte graphique ou pas.
OMI, CGImage
méthodes de dessin ne sont pas mis en œuvre avec le GPU.
Je pense que j'ai lu mentionner à ce sujet sur la documentation d'Apple, mais je ne me souviens pas où. Donc je ne suis pas sûr à ce sujet. De toute façon, je crois, CGImage
est mis en œuvre dans le PROCESSEUR car,
- Son API dirait qu'il a été conçu pour CPU, tels que bitmap interface d'édition de texte et de dessin. Ils ne correspondent pas à un GPU interface très bien.
- Bitmap contexte de l'interface permet un accès direct à la mémoire. Cela signifie qu'il est backend de stockage est situé dans la mémoire de l'unité centrale. Peut-être un peu différent sur l'architecture de mémoire unifiée (et aussi avec le Métal de l'API), mais de toute façon, la conception initiale de l'intention de l'
CGImage
devrait être pour le CPU.
- De nombreux récemment publié Apple d'autres Api de mentionner l'accélération GPU de manière explicite. Cela signifie que leurs aînés Api ne sont pas. Si il n'y a pas de mention spéciale, ce qui se fait habituellement dans le CPU par défaut.
Il semble donc tout à fait dans l'UC. Les opérations graphiques fait de l'unité centrale sont beaucoup plus lent que dans le GPU.
Simplement de détourage d'une image et de composition de l'image couches sont très simples et à bas prix des opérations pour les GPU (par rapport à l'UC), de sorte que vous pouvez vous attendre au UIKit bibliothèque utilisera cette parce que tout UIKit est implémenté sur OpenGL.
Au Sujet Des Limites
Parce que l'optimisation est une sorte de travail sur la micro-gestion, de chiffres précis et les petits faits sont très importants. Quelle est la taille moyenne? OpenGL sur iOS généralement des limites de taille de texture maximale de 1024 x 1024 pixels (peut-être plus dans les dernières versions). Si votre image est plus grande que cela, il ne fonctionne pas, ou les performances seront dégradées considérablement (je pense que UIImageView est optimisé pour les images dans les limites).
Si vous avez besoin d'afficher des images énormes avec écrêtage, vous devez utiliser une autre optimisation comme CATiledLayer
et c'est une histoire totalement différente.
Et n'allez pas OpenGL, sauf si vous voulez connaître tous les détails de l'OpenGL. Il a besoin de plein de compréhension sur bas niveau des graphismes et 100 fois plus de code au moins.
Sur Un Avenir
Si elle n'est pas très susceptibles de se produire, mais CGImage
aliments pour animaux (ou autre chose) n'a pas besoin d'être coincé dans le CPU seul. N'oubliez pas de vérifier la technologie de base de l'API que vous utilisez. Encore, GPU étoffes sont très différentes monstre de la CPU, puis de l'API gars généralement clairement et explicitement mention.