Есть ли наказание за смешение цветовых пространств? (Основная графика)

Если я пишу код рисования в Core Graphics на Mac OS X или iPhone OS, я могу установить красный цвет активной заливки, вызвав:

CGContextSetRGBFillColor(context, 1.0, 0.0, 0.0, 1.0); // RGB(1,0,0)

Если мне нужно 50 % серого, я мог бы вызвать:

CGContextSetRGBFillColor(context, 0.5, 0.5, 0.5, 1.0); // RGB(0.5,0.5,0.5)

Но для оттенков серого заманчиво сделать более короткую линию и позвонить:

CGContextSetGrayFillColor(context, 0.5, 1.0);

Однако эта функция НЕ просто вызывает метод RGB с трехкратным копированием значения интенсивности; вместо этого он меняет цветовое пространство контекста с DeviceRGB на DeviceGray. Следующий вызов метода RGB переключит его обратно.

Мне любопытно узнать:

  • Каков штраф за переключение цветовых пространств?
  • Есть ли штраф за рисование, когда цветовое пространство вашего контекста не соответствует собственному цветовому пространству вашего устройства? (т. е. рисование в DeviceGray по сравнению с DeviceRGB)

Я спрашиваю из технического любопытства, а не из желания преждевременной оптимизации, поэтому, пожалуйста, сведите ваши наставления к минимуму.


person benzado    schedule 27.01.2010    source источник
comment
Не знаю, быстрее ли это, но не могли бы вы проверить это, создав тестовый проект, который проверяет это? В одном прогоне проверялось бы заполнение с помощью постоянного использования одного и того же цветового пространства, а во втором выполнялось бы переключение между цветовыми пространствами. Я предполагаю, что если есть штраф, он заключается в преобразовании значений цвета из вашего цветового пространства в цветовое пространство растрового изображения, но разница между тестами будет незначительной.   -  person lucius    schedule 10.02.2010
comment
Да, на данный момент я планирую написать тестовый код, когда у меня будет время. Я ждал, чтобы сначала получить значок Tumbleweed, но, похоже, мой вопрос не совсем неинтересен.   -  person benzado    schedule 10.02.2010


Ответы (2)


Концептуально штраф есть, но на практике он настолько ничтожен, что не имеет значения; преобразование (например) оттенка серого в триплет RGB (плюс альфа) является тривиальной арифметикой даже с пользовательским цветовым пространством.

Однако цветовые пространства действуют при рисовании изображений имеют недостатки, поскольку это больше, чем вопрос одной операции преобразования. Каждый пиксель должен быть преобразован, и хотя здесь можно выполнить оптимизацию (например, CLUT, таблицы поиска цветов полезны, если исходное изображение использует индексированные цвета), они, как правило, бесполезны в ситуациях, когда вы также находите Кварцевый код.

Вы говорите, что ожидаете, что CGContextSetGrayFillColor() изменит цветовое пространство графического контекста, но на самом деле это не так. Это потребовало бы преобразования содержимого этого графического контекста в соответствии с новым цветовым пространством контекста. Поскольку гораздо дешевле и проще преобразовать цвет вместо буферов контекста (например, сделав CGContextSetGrayFillColor() скрытой оболочкой вокруг CGContextSetRGBFillColor()), таких затрат можно избежать в любой разумной реализации.

person Jonathan Grynspan    schedule 06.07.2010
comment
Документация четко заявляет, что функции CGContextSet*Color() изменяют цветовое пространство контекста. Но я не думаю, что это то же самое, что изменить цветовое пространство буфера, в который вы рисуете. - person benzado; 09.07.2010
comment
Нет, там сказано, что они устанавливают цветовые пространства fill или stroke — цветовые пространства, в которых переданные вами значения CGFloat образуют цветовую координату. Это просто означает, что когда вы затем предоставляете R, G, B, A или любые другие значения, которые вы передали, они интерпретируются правильно. Цветовое пространство контекста, если его можно представить как имеющее, всегда соответствует цветовому пространству пункта назначения; несовпадение двух было бы бессмысленным. :) См. документы для CGContextSetStrokeColorSpace() и CGContextSetFillColorSpace() - все эти функции в конечном итоге охватывают одну из этих функций & CGContextSetFillColor(). - person Jonathan Grynspan; 09.07.2010
comment
(Или около CGContextSetStrokeColor() в зависимости от ситуации. Не хватило места.) - person Jonathan Grynspan; 09.07.2010

Я активно использовал оба варианта аналогичным образом и не заметил снижения производительности.

person Nick Toumpelis    schedule 10.03.2010
comment
Я полагаю, что любая разница в производительности ниже порога обнаружения. - person benzado; 12.03.2010
comment
Да. Тем не менее, если вы считаете, что это может привести к снижению производительности, правильным будет запустить тесты производительности. Из опыта я могу сказать вам, что только методы/свойства, которые непосредственно рисуют на экране (или влияют на рисование), могут иметь штраф, например. корректируетFontSizeToFitWidth. Это не всегда может быть очевидно. - person Nick Toumpelis; 15.03.2010