2012-07-11 7 views
1

두 개의 텍스트 선이 고정 너비로 ​​그려져있는 맞춤 drawRect 방법으로보기가 있습니다. 이보기는 항상 텍스트의 위치와 텍스트 내용이 항상 변경되어 초당 약 16 회의 비율로 다시 그려집니다. 나는 또한 나의 텍스트가 어떤 배경에서 명확하게 볼 수있는 방법으로 그려 질 필요가 있고, 그 목적을 위해 나는 다음을 수행하십시오iOS에서 테두리가있는 텍스트를 효율적으로 그립니다.

CGContextSetTextDrawingMode(ctx, kCGTextStroke);  // Border mode 
[string drawAtPoint:point withFont:font]; 
CGContextSetTextDrawingMode(ctx, kCGTextFill);   // Text mode 
[string drawAtPoint:point withFont:font]; 

이 코드는 유선 폭 경계 모드에서 텍스트를 그립니다 같은 위치에서 채우기 모드로 텍스트를 다시 그립니다. 이 방법으로 각 문자 주위에 흰색 테두리가있는 파란색 텍스트가 나타납니다.

결과는 성능면에서 저를 위해서 절대적으로 만족합니다. 시간 프로필러 사용 전체보기를 그리는 데 소요 된 시간의 약 70 %가 테두리 (획) 모드로 텍스트를 그리는 실행에 소비되었음을 알았습니다. 그러나 채우기 모드의 그리기는 전체 뷰 그리기 시간의 단 3 %를 차지합니다. 뷰의 다시 그리기 빈도를 고려할 때 이것이 효율적이지 않다고 생각합니다.

그래서 누구든지 더 효율적으로 각 문자 주위에 테두리가있는 텍스트를 그리는 방법을 알고 있습니까?

답변

4

두 가지 옵션 :

  1. 대신 윤곽 그림의 그림자를 사용 CGContextSetShadowWithColor
  2. 캐시 문자열의 이미지와 그것의 윤곽이 CGLayer 사용 : CGLayerCreateWithContext

설명 2를 위해 :

그리기 텍스트는 문자가 한 색상으로 채워진 표준 경우에 최적화되어 있습니다. 매번 윤곽선에서 개별 글리프 (문자)가 렌더링되지 않습니다. 대신 글리프는 캐시되고 다시 사용되는 버퍼링 된 이미지에 한 번만 그려집니다.

그리기 개요가 드물게 글리프 (glyph) 또는이 모드에 대한 다른 최적화를 캐싱하지 않습니다. 따라서 아이디어는 캐싱을 직접 수행하는 것입니다. 전체 문자열을 하나의 이미지로 그려 넣고 그 이미지를 주위에 유지하고 drawRect: 메서드 내에서 텍스트 대신 그립니다.

  1. CGLayer
+0

대답 해 주셔서 감사합니다 CGBitmapContext

  • 사용 UIGraphicsBeginImageContext
  • 사용을 사용

    그렇게하는 방법을 몇 가지 옵션이 있습니다. 첫 번째 부분을 그림자로 구현했으며 스트로크 모드에서 텍스트를 그릴 때보 다 두 배 더 느리다는 것은 꽤 논리적이다. 하지만 이미지 캐싱에 대한 두 번째 옵션을 이해하지 못했습니다. 어떻게 작동하고 어떻게 성능을 향상시킬 수 있습니까? – BartoNaz

  • +0

    올바르게 이해하면 그려진 텍스트를 이미지로 저장 한 다음 현재 텍스트가 캐시 된 텍스트와 동일 할 때마다 내보기에 그려 넣을 수 있습니다. 그러나 텍스트가보기가 다시 그려지는 것보다 작은 빈도로 변경되기 때문에 성능이 실제로 향상됩니다. 아이디어를 가져 주셔서 감사합니다. – BartoNaz

    관련 문제