2010-08-08 3 views
2

drawInContext()를 통해 CALayer 서브 클래스에서 간단한 선 그리기 (중간에 텍스트가있는 줄)를 렌더링합니다. 사용자가 setNeedsDisplay를 호출하여 제스처를 수행 할 때이 레이어를 업데이트합니다. 내가보고있는 효과는 이중 버퍼링이 없다면 기대할 수있는 것입니다. 즉, 새로운 렌더링 부분이 오래된 렌더링 부분을 겹쳐서 보게됩니다. 업데이트를 중단하면 (제스처 완료) 시스템이 "catch up"하고 올바른 최종 결과가 항상 표시되지만 업데이트 중에 일관성없는 결과가 표시됩니다 ...이 효과는 미묘하지 않고 때로는 극단적입니다. 계속 업데이트를 계속하면 그림의 오래된 부분을 화면에 동안 유지할 수 있습니다 ...Quartz가 내 drawInContext()를 이중 버퍼링하지 않는 이유는 무엇입니까?

전혀 이해가 가지 않습니다. Quartz가 버퍼링을하고 있다면 화면 전체에 결과를 블리 팅하지 않거나 영향을받는 영역을 오산하고있는 것으로 보입니다.

것들 나는 시도했다 :

1) 내가 암시 애니메이션을 비활성화하고 내 도면에서 실수를하지 오전 CATransaction

2) 내에서 도면을 모두하고있는 중이 야 ... 그건 말 그대로 사이에 몇 개의 텍스트가있는 단지 두 줄 ... 중간 인공물을 렌더링하는 방법은 없습니다.

3) 업데이트 속도를 제한하려고 시도했지만 그 중 대부분은 건너 뜁니다 ...하지만 더 낮은 속도에서도 업데이트를 중지하고 시스템을 따라 잡을 때까지 아티팩트가 표시됩니다.

4) 이것은 시뮬레이터와 장치 (iPad)에서 동일하게 발생합니다.

오프 스크린 버퍼로 직접 그려 넣고 전체 화면으로 복사해야합니까? 나는 Quartz가 나를 위해 이것을한다는 것을 읽었을 것이라고 생각했다.

업데이트 : 평상시처럼 벽에 머리를 대고 몇 시간 만 지나면 질문을 게시 한 후 5 분 후에 답변을 찾을 수 있습니다. 나는 레이어를 다시 렌더링하기 위해 CATiledLayer를 사용하고 있다는 것을 깨달았습니다. 다시 정상 CALayer로 전환하면 결함이 사라집니다. 그래서 나는 분리 된 타일 렌더링의 인공물을보고있는 것 같아요. 지금은 그래서

+0

문제를 재현하기 위해 간단한 샘플 코드를 만들 수 있습니까? –

답변

0

...이 처리하는 방법을 알아 내려고 노력하고 있어요, 내가 세 가지 문제가 있었다 밝혀 :

1) CATiledLayer 명시 적으로 0.25 초 기본 시간 새로운 타일 내용에 페이드 ... 이것은 내 그림으로 인해 큰 혼란을 불러 일으켰습니다. 내 CATiledLayer 서브 클래스에서 이것을 오버라이드 :

+ (CFTimeInterval)fadeDuration { 
    NSLog(@"got fade duration"); 
    return 0; 
} 

2) 나는 또한 (내가 실제로 사용하는 어떤 크기를 알고하지 않습니다하지만 나는 1024 × 1024로 설정) 최대 타일 크기를 위로 조정했다.

3) 업데이트 도중 레이어의 프레임을 주기적으로 조정했기 때문에 타일링 된 레이어에 추가 문제가있는 것으로 보입니다. 나는 그것을 막기 위해 변화를 만들고 있습니다.

이러한 모든 변경 사항으로 인해 성능이 현재 허용되는 것으로 보입니다.