2010-01-27 2 views
5

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

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); 

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

Мне интересно знать:

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

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

+1

Не знаю, будет ли это быстрее, но разве вы не можете его протестировать, построив тестовый проект, который проверяет это? Один прогон будет тестировать заполнение с использованием того же цветового пространства все время, а другой будет переключаться между цветовыми пространствами. Я бы предположил, что если есть штраф, он преобразует значения цвета из вашего цветового пространства в цветовое пространство растрового изображения, но разница будет незначительной между тестами. – lucius

+0

Да, в этот момент я планирую написать некоторый тестовый код, когда у меня есть время. Сначала я ждал, чтобы получить значок Tumbleweed, но похоже, что мой вопрос не совсем неинтересен. – benzado

ответ

1

Я использую оба экстенсивно подобным образом и не заметил никакого штрафа с точки зрения производительности.

+0

Я полагаю, что любая разница в производительности ниже порога «замечать». – benzado

+0

Да. Тем не менее, правильный способ - запустить тесты, если вы считаете, что может быть штраф за производительность.Из опыта я могу сказать вам, что только методы/свойства, которые непосредственно рисуют на экране (или влияют на рисование), могут иметь штраф, например. adjustsFontSizeToFitWidth. Это может быть не всегда очевидно. –

3

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

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

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

+0

В документации [четко указано] (http://developer.apple.com/iphone/library/documentation/GraphicsImaging/Reference/CGContext/Reference/reference.html#//apple_ref/c/func/CGContextSetRGBFillColor), что 'CGContextSet * Функции Color() 'изменяют цветовое пространство контекста. Но я не думаю, что это то же самое, что изменить цветовое пространство буфера, который вы рисуете. – benzado

+1

Нет, он говорит, что они устанавливают цветовые пространства * fill * or * stroke * - цветовые пространства, в которых ваши переданные значения CGFloat формируют цветовую координату. Это означает, что когда вы предоставляете R, G, B, A или любые другие значения, которые вы передали, они интерпретируются правильно. Цветовое пространство контекста, если оно может считаться имеющим его, всегда соответствует цветовому пространству адресата; наличие двух несоответствий было бы бессмысленным. :) См. Документы для 'CGContextSetStrokeColorSpace()' и 'CGContextSetFillColorSpace()' - эти функции в конечном итоге обертывают один из этих & 'CGContextSetFillColor()'. –

+1

(или вокруг 'CGContextSetStrokeColor()' в зависимости от ситуации. Выйти из комнаты.) –