2012-02-24 3 views
0

내가 시도하고있는 것이 나쁜 생각 일지 궁금하다. 나는 현재 monotouch에서 일하고있다. 동일한 크기의 UIView에 화면 크기 (iPhone 4의 약 320x460 크기)의 버퍼를 충분히 빨리 그려서 버퍼에 대한 애니메이션 변경 사항이 최종 사용자에게 부드럽게 보이도록 할 수 있습니까 (그리기 당 20ms 정도 필요) .Quartz 퍼포먼스 그리기 큰 버퍼

여러 구현을 시도했습니다. 지금까지 가장 좋은 방법은 메모리 내 CGLayer를 사용하고 context.DrawLayer()를 호출하여 Draw() 내부 뷰에 적용하는 것 같습니다. 그러나 DrawLayer 당 30-40ms가 걸립니다.

저는 타일 이미지 컨트롤을 쓰고 있습니다. 성능을 제외하면 아이디어가 잘 작동하고 있습니다. 난 그냥 빨리 UIView에 버퍼를 얻을 방법을 알아낼 수 없습니다.

아이디어가 있으십니까?

답변

1

저는 최근에 커스텀 뷰를 많이 다루었는데 성능 문제도 많이있었습니다.

이러한 성능 문제는 모두 다시 그려야하는 요소를 결정하여 해결할 수 있으며 더 중요한 것은 이 아닌 요소를으로 다시 그려야한다는 것입니다.

그런 다음 레이어의 내용을 개별 하위 레이어로 분할하고 필요한 경우 다시 그립니다. 좋은 점은 애니메이션 등이 개별 레이어에 매우 매끄럽다는 것입니다. (내용은 단순한 비트 맵이며 사용자가 말할 때까지 변경되지 않습니다.)

내가 만난 유일한 제한점은 하위 레이어에 CG 블렌드 모드 (예 : 곱하기)를 사용할 수 없다는 것입니다. 내가 아는 한 그것이 불가능합니다. 하위 레이어의 내용을 그리는 데 사용 된 CG 코드 내에서만 이러한 블렌드 모드를 사용할 수 있지만 그 이후에는 모두 "정상"모드로 구성됩니다.

+0

유일한 까다로운 부분은 버퍼를 끊임없이 업데이트해야한다는 것입니다. 항상 새로운 이미지 타일 (Google지도 생각)을로드 중이므로 버퍼가 많이 바뀝니다. – Aaron

+0

나는이 문제에 대해 정말 도움이되지 못해 죄송합니다. 또 다른 아이디어 : 귀하의 레이어가 화면보다 상당히 큰가요? 저의 경우 엄청난 성능을 발휘했습니다 ... 또한 드로잉 루틴이 느린 부분인지 확신합니까? (그리고 타일을로드하는 코드가 아닌) –

+0

사용자가 주변을 움직이는 것을 중단 할 때 CALayers를 사용하고 새 버퍼를로드하면 균형이 잘 잡힌 것 같습니다.그것은 분명히 문맥에 비트 맵을 그리는 것처럼 병목 항상 보인다. – Aaron

1

정말 무엇을 그리는가에 달려 있습니다.

단색으로 채워진 색을 그리는 경우 문제가되지 않습니다. 문제는 당신이 변화시키고있는 표면의 양과 그것을 바꾸는 방법입니다.

다시 말하지만, 무엇을 그리는가와 일부 작업을 GPU로 오프로드 할 수 있는지 여부에 따라 다릅니다. 예를 들어 인터페이스의 고정 부분이 동일하게 유지되거나 독립적으로 애니메이션/업데이트되는 경우 해당 영역에 대해 다른 레이어를 사용하고 GPU가이를 구성하도록 할 수 있습니다.

레이어는 GPU에 의해 합성되며 자체 비트 맵으로 뒷받침된다는 이점이 있습니다. 레이어의 표면에 그려 넣으면 OS는 결과를 GPU에 캐시하고 모든 레이어를 동시에 작성합니다.

그런 다음 응용 프로그램에서 실제로 다시 그려야하는 부분을 확인하고 각 프레임에서 해당 부분 만 다시 그리기 만 할 수 있습니다.

하지만 다시 한 번 당신이하려는 일에 크게 의존 할 것입니다.

+0

이것은 제가 취한 접근법입니다. 문제는 내 레이어를 지속적으로 업데이트해야한다는 것입니다. 나는 Google지도가 얻는 것과 비슷한 모양을 만들기 위해 노력하고 있습니다. 그 레이어/버퍼를 유지하고 성능을 유지하는 방법을 알아 내지 못했습니다. 정적이라면 문제가 없습니다. – Aaron