2010-11-28 3 views
7

:CALayer에 뷰의 내용 비트 맵이 포함되어 있지 않으십니까? 워드 프로세서

"레이어가 가벼운 물체 (의 CALayer) 그,하지만 비슷한에 뷰는 실제로 모델 이보기에 할당 된 개체입니다." 나를 위해 경량

콘텐츠에 대한 무거운 비트 맵을 제외한다. CALayer는 "진짜", UIView는 단지 래퍼 일 뿐이라고 생각했습니다. 모든보기에는 서로 다른 나무 (모델, 프리젠 테이션, 렌더링)에 3 개의 CALayers가 있습니다. 그래서 3 비트 맵은 없습니까? 오직 하나?

답변

17

용어 "경량"는 Mac에서 발생하는 문서의 조각에서 비롯됩니다. Joe가 지적한 것처럼 NSView는 iPhone의 UIView와 비교할 때 상당히 복잡한 UI 요소입니다. 리소스가 제한적인 모바일 장치에서도 화면을 중심으로 수십 개의 UIView를 애니메이션으로 만들 수 있지만 NSView는 화면에 많은 요소를 추가하기 시작할 때 시스템에 더 많은 부담을줍니다. UIKit은 처음부터 코어 애니메이션을했다, 애플이 일을 무엇을 배울 수있는 기회를 가지고 무엇을 AppKit의하지 않았다 때문에, AppKit의 이상 UIKit의 새로운 시작에 의해 얻은 것들 중 하나입니다. 비교

는있는 CALayer는 거의가 그리는 기본 GPU 기반 비트 맵 사각형 텍스처에 추가, 그래서 그들은 많은 오버 헤드를 추가하지 마십시오. iPhone에서는 UIView가 CALayer 주위의 경량 래퍼이기 때문에 UIView와 크게 다르지 않습니다. 나는이에 카운트 Chocula에 동의하고있는 CALayer가 GPU에 비트 맵 텍스처를 래핑하는 것처럼 보인다 말할거야

. 예. 사용자 정의 Quartz 드로잉을 지정하여 레이어의 내용을 구성 할 수 있지만 필요한 경우에만 드로잉이 수행됩니다. 레이어의 내용이 그려지면 레이어를 이동하거나 애니메이션을 적용 할 때 다시 그릴 필요가 없습니다. 변환을 레이어에 적용하면 벡터 그래픽을 처리하지 않는다는 신호인 확대 된 픽셀을 얻을 수 있습니다.

또한, -renderInContext: 접근 방식이 PDF에 적합하지 않기 때문에 Core Plot 프레임 워크 (그리고 내 응용 프로그램에서)를 사용하여 CALayers의 일반적인 그리기 프로세스를 재정의해야했습니다. 이것을 사용하여 레이어와 하위 레이어를 PDF로 렌더링하면 벡터 요소가 아닌 최종 PDF에서 레이어가 래스터 비트 맵으로 표시된다는 것을 알 수 있습니다. 다른 렌더링 경로를 사용하여 PDF에 적합한 출력을 얻을 수있었습니다.

iOS 3.2의 새로운 shouldRasterizerasterizationScale 속성으로 아직 처리하지 못했습니다.

실제로 CALayers (및 백업 레이어가있는 UIView)는 비트 맵 콘텐츠를 고려할 때 많은 메모리를 소비합니다. "가벼운"측정 값은 콘텐츠 상단에 얼마나 추가되는지, 이는 거의 적습니다. Object Allocation과 같은 도구에서 메모리 사용량을 볼 수는 없지만 응용 프로그램에 큰 레이어를 추가하면 Memory Monitor에서 응용 프로그램 또는 Core Animation 서버를 소유하고있는 SpringBoard에서 메모리가 급증하는 것을 볼 수 있습니다.

프리젠 테이션 계층과 모델 계층에서 비트 맵이 중복되지 않습니다. 주어진 순간에 하나의 비트 맵 텍스처 만 화면에 표시되어야합니다. 서로 다른 레이어는 주어진 순간에 속성과 애니메이션을 추적하기 만하므로 매우 적은 정보 만 각각에 저장됩니다.

+0

Georgeous! 감사! 이 모든 것들을 어디에서 알 수 있습니까? 그걸 어디서 읽어야 할까? –

+0

@BugAlert - 주로 엔지니어와 대화하고 CALayers와 많은 시간을 내 응용 프로그램에서 사용합니다. 나는 2010 년 Core Animation WWDC 비디오뿐만 아니라 iPhone의 성능 튜닝에 관한 WWDC 2009 비디오를 통해 Apple이 이에 대해 힌트를 흩트 리고 있다고 생각합니다. Core Animation Programming Guide는 렌더링 아키텍처에 대해서도 자세히 설명합니다. –

+0

위대한 답변, 엄청난 양의 정보에 감사드립니다! –

2

내가 알고있는 방법은있는 CALayer는 석영 그리기 표면의 표현입니다. 비트 맵의 ​​관점에서는 생각할 수 없지만 내용, 변환, 그림자 등을 포함하여 드로잉 컨텍스트의 현재 상태를 캡슐화하는 컨테이너에 대해서는 실제로 생각할 수 없습니다. 기본적으로 코코아에 남아있는 동안 GPU에 가깝지만 비트 맵을 나타내는 것과 같지 않습니다. 오히려 지시에 따라 내용을 재생하는 데 필요한 모든 정보를 나타냅니다. 따라서 예를 들어, 선을 그릴 경우 내부적으로 레이어의 좌표를 GPU로 전달하고 렌더링 할 픽셀을 걱정할 필요없이 후자가 그리게 할 수 있습니다.

UIView와 비교할 때 레이어는 디스플레이 작업에만 전념한다는 의미에서 "경량"이며 이벤트 나 터치에 응답하는 등의 작업을 처리하지 않습니다.

모델과 프리젠 테이션 레이어를 모두 가지고있는 이유는 후자가 모든 애니메이션을 고려하여 레이어의 상태 인 을 나타 내기 때문입니다. 그렇기 때문에 문서에서 프레젠테이션 계층에 대한 테스트를 수행하는 것이 좋습니다. 의 CALayer을 참조에

+0

수동으로 적중 테스트를하고 싶습니다. 기내 애니메이션이 발생하면 어떻게됩니까? –

+0

점이 주어진 레이어 계층에 있는지 확인하고 싶을 때마다. 토론을 위해이 질문을 참조하십시오 : http://stackoverflow.com/questions/2199171 –

+0

CALayer가 GPU에서 비트 맵 텍스처로 캐시되는지 여부와 관련하여 귀하의 의견에 동의하지 않습니다. 내 대답에서 설명했듯이, (Apple 엔지니어와의 대화를 포함하여) 나의 모든 경험은 그렇지 않다는 것을 나타냅니다. CALayer를 움직이거나 크기를 조정할 때마다 벡터 요소가 확실히 다시 그려지지 않습니다. 그 성능은 끔찍할 수 있습니다. 사실 CALayer에 스케일링 변환을 적용 할 때 픽셀 화가 명확하게 나타납니다. –

관련 문제