2009-12-30 5 views
1

코어 그래픽을 사용하여 아이폰 용 차트 응용 프로그램을 개발하고 있습니다. 내 요구 사항은 다음과 같습니다. drawRect 메서드 내에서 모든 그리기 함수를 구현했습니다. 차트에서 일부 업데이트가 발생하면 [self setNeedsDisplay : true]를 호출해야하며 처음부터 drawRect 메서드를 호출합니다. 즉, drawRectMethod 내의 모든 메서드를 실행한다는 의미입니다. 따라서 터치 이벤트 그리기가 그리 매끄럽지 않습니다. 어떤 특정 부분을 drawRect 메서드로 그릴 필요가 있습니다. 핵심 그래픽으로도 가능합니까?별도의 레이어 - 객관적인 코어 그래픽

답변

2

"분리 된 레이어"의 의미는 명확하지 않지만, 그게 -drawRect:은 현재 많은 계산을하는 크고 복잡한 함수입니다. 너무 많이 호출되기 때문에 너무 느리게 실행됩니다 .CALayer는 언급하지 않았으므로 여기서는 실제 레이어가 아니라고 가정합니다.

이것에 대한 해결책은 0123에서 계산을 이동하는 것입니다.. 데이터가 실제로 변경 될 때만 필요한 모든 것을 계산해야합니다. -drawRect:에서는 미리 계산 된 값을 사용하는 것이 훨씬 빠릅니다.

예를 들어, Core Graphics를 언급 했으므로 CGPath와 같은 것을 사용한다고 가정합니다. 데이터가 변경된 경우에만 CGPath를 계산 한 다음 CGPath를 ivar에 저장해야합니다. -drawRect: CGPath를 그려야합니다. CGPath가 특히 복잡하기 때문에 CGImage로 미리 렌더링 한 다음 CGImage를 합성하는 것이 좋습니다.

가능한 경우 iPhone에서 Core Graphics를 완전히 사용하지 말고 Photoshop에서 이미지를 사전 렌더링 한 다음 Resources 폴더에 저장해야합니다. 3G는 복잡한 Core Graphics 프로세싱을 따라 잡기 위해 컴퓨팅 성능을 필요로하지 않습니다. 이는 Mac에서 최근에 발표 한 Apple의 권장 사항을 뒤집은 것입니다. 사전 렌더링 된 이미지를 사용하지 않고 그라디언트와 경로를 장려하며 3GS를 사용하면 훨씬 빠른 프로세서로 인해 중요성은 줄어들지 만 여전히 iPhone, 그리고 아마도 더 높은 해상도의 iPhone 디스플레이가 출시 될 때까지있을 것입니다. 동적 이미지가있는 경우에는 물론 불가능하지만 정적 이미지의 경우이를 명심해야합니다.

편집 :

먼저, 실제적인 경우는 더러 그 부분을 그리기하고 있는지 확인하십시오. -drawRect:은 더러운 직사각형을 전달합니다. 특정 요소가 해당 직사각형과 교차하지 않으면 다시 그릴 필요가 없습니다. 마찬가지로 업데이트해야 할 부분을 나타내려면 -setNeedsDisplayInRect:을 사용해야합니다. 보기를 겹치지 않는 사각형 (또는 가끔씩 겹치는 사각형)으로 쉽게 나눌 수 있다면 잘됩니다.

독립적으로 계산하려는 다양한 중첩 구성 요소로 구성된보기가있는 경우 각각을 CALayer에 그릴 수 있고 뷰에 레이어를 첨부 할 수 있습니다 (보기 자체에는 아무 것도 그리지 않음).). 그런 다음 변경된 계층에서만 -setNeedsDisplay으로 전화 할 수 있습니다. 이것은 내가 수직선의 예를 위해 사용하는 것입니다. CALayer 선의 너비와 뷰의 높이를 만들고 배경색을 선 색으로 설정 한 다음 원하는 위치에 뷰에 연결합니다. 그 다음 줄을 이동하는 것은 매우 빠릅니다 (또는 변환을 사용하여 줄을 회전시키는 것). 나중에 줄을 제거하는 것은 간단합니다. 더 멋진 선 그리기 (앤티 앨리어싱 등)를 원한다면 레이어를 더 넓게 만들 수 있고 실제로 레이어 내부에 선을 그릴 수 있습니다. 필요한 경우 레이어가보기만큼 클 수 있습니다.

Core Animation Programming Guide 광범위한 CALayer에 문서와 사용 방법이 있습니다.

관련 문제