2010-12-15 5 views
12

Cela peut être une question vraiment stupide, mais quelqu'un peut-il me dire la différence entre la création d'un CGContextRef en utilisant UIGraphicsBeginImageContext et en utilisant CGBitmapContextCreate pour dessiner des images? Surtout maintenant que le dessin UIKit est thread-safe, je me demandais s'il y avait une raison d'utiliser CGBitmapContextCreate sur UIGraphicsBeginImageContext.UIGraphicsBeginImageContext vs CGBitmapContextCréer sur iOS

+2

"question vraiment stupide" ne vous obtenez habituellement +6 upvotes;) – Mazyod

Répondre

10

Selon Apple UIKit Function Reference, qui porte la date de couverture du 15 Novembre 2010, UIGraphicsBeginImageContext et les fonctions connexes doivent encore être appelés sur le thread principal seulement. Le même texte est répété dans la documentation du développeur fournie avec le dernier Xcode, 3.2.5. Cependant, il rapporte la même chose pour UIGraphicsGetCurrentContext que j'ai explicitement compris être thread safe maintenant. Ma compréhension était que seulement UIGraphicsGetCurrentContext et les classes UIImage, UIColor et UIFont sont maintenant thread safe plutôt que l'intégralité de UIKit, mais je suis incapable de trouver une référence définitive. Quoi qu'il en soit, UIGraphicsBeginImageContext est un wrapper UIKit qui se trouve au-dessus de CGBitmapContextCreate et réduit ses fonctionnalités. En particulier, vous êtes limité aux images d'espace colorimétrique RGBA avec un ordre de composant fixe (bien que cela varie en fonction de la version iOS) et vous ne pouvez pas spécifier votre propre tampon cible pour le dessin. Ainsi, par exemple, il est inutile de faire un tas de composition CoreGraphics, puis de publier le résultat sur OpenGL et inutile pour rediriger les graphismes que vous avez déjà sous forme de tableau dans CoreGraphics. Cependant, lorsque la méthode UIKit prend en charge les fonctionnalités dont vous avez besoin et que vous pouvez utiliser en toute sécurité, il n'y a aucun avantage inhérent aux méthodes CoreGraphics.

+4

http://developer.apple.com/library/ios/#releasenotes/General/WhatsNewIniPhoneOS/Articles/iPhoneOS4.html#// apple_ref/doc/uid/TP40009559-SW29 il est dit dans les notes de publication que dessiner dans un contexte graphique est sûr pour les threads, vous pensez que leur documentation est juste inconsistante? J'ai essayé d'appeler UIGraphicsBeginImageContext à partir d'une file d'attente de répartition et cela a bien fonctionné. +1 pour l'explication détaillée, je pensais que ce pourrait être juste un emballage mais n'était pas sûr, merci encore. – marchinram

+0

Une autre question, d'après votre expérience, est plus rapide que l'autre? Je pense que descendre au niveau de CG serait plus rapide, mais je ne sais pas avec certitude. – marchinram

+0

Les deux choses sont incohérentes - je parie que les notes de version sont plus précises, car elles ont été écrites spécifiquement pour mettre en évidence de nouvelles fonctionnalités alors que les autres n'ont probablement pas été mises à jour. Je m'attendrais à ce que les appels CoreGraphics directs aient un avantage de performance théorique extrêmement faible par rapport aux appels Objective-C, mais rien d'important. Pour UIGraphicsBeginImageContext, qui est un appel C, je ne m'attendrais pas à ce que la différence soit mesurable - la fonction UIKit appellera simplement le CoreGraphics et la chose qui coûtera sera la création du contexte. – Tommy