2010-01-27 4 views
5

내가 호출하여 빨간색으로 활성 채우기 색상을 설정할 수 있습니다, 맥 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); 

Howev 나는 통화 할 수 이 함수는 RGB 값을 3 번 복사 한 RGB 값을 단순히 호출하는 것이 아닙니다. 대신 컨텍스트의 색 공간을 DeviceRGB에서 DeviceGray로 변경합니다. 다음에 RGB 메서드를 호출하면이 메서드가 다시 전환됩니다. 내가 궁금

은 알고 :

색 공간 전환에 대한 처벌은 무엇
  • ?
  • 컨텍스트의 색 공간이 장치의 기본 색 공간과 일치하지 않을 때 그리는 것에 대한 패널티가 있습니까? (즉, DeviceGray 대 DeviceRGB를 그리기)

기술적 인 호기심이 아니라 조기에 최적화하려는 욕구가 있으므로 최대한 알려 주시기 바랍니다.

+1

더 빠른지는 알 수 없지만 이것을 테스트하는 테스트 프로젝트를 빌드하여 테스트 할 수는 없습니까? 하나의 실행은 항상 동일한 색상 공간을 사용하여 채우기를 테스트하고 다른 하나는 색상 공간 사이를 전환합니다. 페널티가있는 경우 색상 값을 비트 맵의 ​​색상 공간으로 변환하는 것이지만 차이점은 테스트 사이에 무시할 수있을 것이라고 추측합니다. – lucius

+0

그래,이 시점에서 나는 시간이있을 때 몇 가지 테스트 코드를 작성할 계획이다. 나는 Tumbleweed 배지를 먼저 얻으려고 기다리고 있었지만 제 질문이 충분히 흥미롭지는 않은 것 같습니다. – benzado

답변

1

저는 비슷한 방식으로 폭넓게 사용 해왔고 성능면에서 불이익을 느끼지 않았습니다.

+0

성능 차이가 "눈치 채기"임계 값 이하라고 상상해보십시오. – benzado

+0

예. 그러나 적절한 방법은 성능상의 불이익이있을 수 있다고 판단되면 벤치 마크를 실행하는 것입니다.경험에 비추어 볼 때, 직접 화면에 그리는 (또는 그림에 영향을주는) 메서드/속성 만이 패널티를 가질 수 있음을 알 수 있습니다. adjustsFontSizeToFitWidth. 이것은 항상 명확하지 않을 수 있습니다. –

3

개념적으로 페널티가 있지만 실제로는 관련이 없으므로 매우 작습니다. 예를 들어 그레이 레벨을 RGB 삼중 항 (알파 플러스)으로 변환하는 것은 커스텀 컬러 공간에서도 사소한 산술 연산이다.

색 공간 do은 하나의 변환 작업 이상이므로 그림을 그릴 때 패널티가 있습니다. 모든 픽셀을 변환해야하며 여기에서 수행 할 수있는 최적화가 있지만 (예 : CLUT, 색상 룩업 테이블은 소스 이미지가 색인 된 색상을 사용하는 경우 유용합니다.) 사용자가 찾은 상황에서 유용하지 않은 경향이 있습니다 석영 코드.

그래픽 컨텍스트의 색 공간을 변경하려면 CGContextSetGrayFillColor()이 필요하다고 생각하지만 사실은 그렇지 않습니다. 그렇게하면 컨텍스트의 새로운 색 공간과 일치하도록 해당 그래픽 컨텍스트의 내용을 변환해야합니다. 컨텍스트의 버퍼 대신에 색을 변환하는 것이 훨씬 저렴하고 간단하기 때문에 (예 : CGContextSetGrayFillColor()CGContextSetRGBFillColor() 주위의 언더 커버 랩퍼로 만들면) 현명한 구현에서는 이러한 비용을 피할 수 있습니다.

+0

CGContextSet 문서가 [명확하게 기술하고있다] (http://developer.apple.com/iphone/library/documentation/GraphicsImaging/Reference/CGContext/Reference/reference.html#//apple_ref/c/func/CGContextSetRGBFillColor) * Color()'함수는 컨텍스트의 색 공간을 변경합니다. 하지만 당신이 그리는 버퍼의 색 공간을 변경하는 것과 같지 않다고 생각합니다. – benzado

+1

아니요, 그들은 fill * 또는 * stroke * 색상 공간 - 전달 된'CGFloat' 값이 색상 좌표를 형성하는 색상 공간을 설정한다고 말합니다. 즉, R, G, B, A 등의 값을 입력하면 전달 된 값이 올바르게 해석됩니다. 컨텍스트의 색 공간은 컨텍스트의 색 공간을 가질 것으로 생각 될 수있는 경우 항상 대상의 색 공간과 일치합니다. 두 사람이 일치하지 않는 것은 무의미합니다. :) 'CGContextSetStrokeColorSpace()'와'CGContextSetFillColorSpace()'에 대한 문서를보기 바란다.이 모든 기능들은 궁극적으로 &'CGContextSetFillColor()'중 하나를 감싸고있다. –

+1

(또는 적절하게'CGContextSetStrokeColor()'주변. 방 밖으로 떨어지다.) –