UIGraphicsBeginImageContext против CGBitmapContextCreate в iOS

Это может быть действительно глупый вопрос, но может ли кто-нибудь сказать мне разницу между созданием CGContextRef с использованием UIGraphicsBeginImageContext и использованием CGBitmapContextCreate для рисования изображений? Особенно теперь, когда рисование UIKit является потокобезопасным, мне было интересно, есть ли причина использовать CGBitmapContextCreate поверх UIGraphicsBeginImageContext.


person marchinram    schedule 15.12.2010    source источник
comment
действительно глупые вопросы обычно не приносят +6 голосов;)   -  person Mazyod    schedule 06.09.2012


Ответы (1)


Согласно справочнику по функциям UIKit от Apple, дата обложки - 15 ноября 2010 г., UIGraphicsBeginImageContext и связанные функции должны по-прежнему вызываться только в основном потоке. Тот же текст повторяется в документации разработчика, которая поставляется с последней версией Xcode, 3.2.5. Однако он сообщает то же самое для UIGraphicsGetCurrentContext, который, как я понял, теперь безопасен для потоков. Насколько я понимаю, только UIGraphicsGetCurrentContext и классы UIImage, UIColor и UIFont теперь являются потокобезопасными, а не весь UIKit, но я не могу найти точную ссылку.

Тем не менее, UIGraphicsBeginImageContext - это оболочка UIKit, которая располагается поверх CGBitmapContextCreate и снижает ее функциональность. В частности, вы ограничены изображениями цветового пространства RGBA с фиксированным порядком компонентов (хотя он зависит от версии iOS) и не можете указать собственный целевой буфер для рисования. Так, например, бесполезно выполнять кучу композиции CoreGraphics, а затем отправлять результат в OpenGL и бесполезно для передачи графики, которую вы уже получили в виде массива в CoreGraphics.

Однако там, где метод UIKit поддерживает нужную вам функциональность и безопасен в использовании, у методов CoreGraphics нет неотъемлемых преимуществ.

person Tommy    schedule 15.12.2010
comment
developer.apple.com/library/ios/#releasenotes/General/ в примечаниях к выпуску говорится, что рисование в графическом контексте является потокобезопасным, вы думаете, что их документация просто несовместима? Я пробовал вызвать UIGraphicsBeginImageContext из очереди отправки, и он работал нормально. +1 за подробное объяснение, я подумал, что это может быть просто обертка, но не был уверен, еще раз спасибо. - person marchinram; 15.12.2010
comment
Еще один вопрос, из вашего опыта, в одну сторону быстрее, чем в другую? Я бы подумал, что перейти на уровень компьютерной графики будет быстрее, но точно не знаю. - person marchinram; 15.12.2010
comment
Эти две вещи несовместимы - я уверен, что примечания к выпуску более точны, поскольку они были написаны специально для выделения новых функций, тогда как другая документация, вероятно, просто не обновлялась. Я ожидал, что прямые вызовы CoreGraphics будут иметь крайне небольшое теоретическое преимущество в производительности по сравнению с вызовами Objective-C, но ничего, что могло бы иметь значение. Для UIGraphicsBeginImageContext, который является вызовом C, я бы не ожидал, что разница будет измеримой - функция UIKit просто вызовет CoreGraphics, и затраты будут на создание контекста. - person Tommy; 16.12.2010
comment
На мой взгляд, создание внеэкранного контекста и рендеринг с вызовами CG ... вместо вызовов UI ... не представляет особой сложности. Я бы придерживался методов CG ... для обеспечения безопасности потоков. - person Matt Connolly; 21.10.2011