2010-12-15 16 views
12

Bu gerçekten aptalca bir soru olabilir, ancak birisi bana UIGraphicsBeginImageContext kullanarak bir CGContextRef oluşturma ve resim çizmek için CGBitmapContextCreate kullanma arasındaki farkı söyleyebilir mi? Özellikle UIKit çiziminin iplik güvenli olduğundan beri UIGraphicsBeginImageContext üzerinden CGBitmapContextCreate kullanmak için herhangi bir neden olup olmadığını merak ediyordum.UIGraphicsBeginImageContext vs CGBitmapContextCreate on iOS

+2

"Gerçekten aptal bir soru genellikle seni alamazsın +6 upvotes;) – Mazyod

cevap

10

Apple'ın UIKit Function Reference'a göre, 15 Kasım 2010 tarihli kapak tarihini taşıyan UIGraphicsBeginImageContext ve ilgili işlevler yalnızca ana iş parçacığına çağrılmalıdır. Aynı metin, en son Xcode, 3.2.5 ile gelen geliştirici belgelerinde tekrarlanır. Ancak, şimdi iş parçacığı için güvenli olduğunu açıkça anladığım UIGraphicsGetCurrentContext için bunu bildiriyor. Benim anlayışım, sadece UIGraphicsGetCurrentContext ve UIImage, UIColor ve UIFont sınıflarının artık UIKit'in bütününden ziyade iş parçacığı olduğuydu, ancak kesin bir referans bulamadım.

UIGraphicsBeginImageContext, CGBitmapContextCreate'un üstüne oturan ve işlevselliğini azaltan bir UIKit sarıcısıdır. Özellikle sabit bir bileşen siparişiyle (iOS sürümüne göre değişiklik gösterse de) RGBA renk uzay görüntüleriyle sınırlıdır ve çizim için kendi hedef tamponunuzu belirleyemezsiniz. Yani, örneğin, bir dizi CoreGraphics bileşimi yapmak ve daha sonra sonuçları OpenGL'ye yayınlamak ve CoreGraphics'e bazı dizi formunda sahip olduğunuz piping grafikleri için yardımcı olmak işe yaramaz. Ancak, UIKit yönteminin ihtiyacınız olan ve kullanması güvenliğini sağladığı yerlerde, CoreGraphics yöntemlerinde doğal bir avantaj yoktur.

+4

http://developer.apple.com/library/ios/#releasenotes/General/WhatsNewIniPhoneOS/Articles/iPhoneOS4.html#// apple_ref/doc/uid/TP40009559-SW29 sürüm notlarında bir grafik içeriğine çizim yapmanın güvenli olduğunu ve belgelerinin tutarsız olduğunu mu düşünüyorsunuz? UIGraphicsBeginImageContext'i bir gönderim kuyruğundan aramayı denedim ve iyi çalıştı. Ayrıntılı açıklama için +1, sadece bir sarıcı olabileceğini düşündüm ama emin değildim, tekrar teşekkürler. – marchinram

+0

Deneyimlerinizden bir soru daha diğerinden daha hızlı mı? CG seviyesine inmek daha hızlı olacağını düşünürdüm, ama kesin olarak bilmiyorum. – marchinram

+0

İki şey tutarsız - Yeni sürümleri vurgulamak için özel olarak yazıldığından, diğer belgelerin muhtemelen güncellenmediğinden, sürüm notlarının daha doğru olduğuna inanıyorum. Doğrudan CoreGraphics çağrılarının Objective-C çağrılarına göre çok az teorik bir performans avantajına sahip olmasını beklerdim, ama önemli olabilecek hiçbir şey yok. Bir C çağrısı olan UIGraphicsBeginImageContext için, farkın ölçülebilir olmasını beklemeyeceğim - UIKit fonksiyonu sadece CoreGraphics'i ve maliyetlerin içeriğin yaratılması olayı olarak adlandıracaktır. – Tommy