2009-09-16 3 views
2

나는 게임을 개발 중입니다. 그래픽을 잡기 위해 약 150 UIImageView를 사용하고 있습니다. 3D 환경을 시뮬레이션 중이므로 z 순서 (카메라에 대한 객체의 근접 정도)를 변경하고 싶습니다.iPhone에서 서브 뷰의 z 순서 변경

나는 알고 있습니다 : [superWindow exchangeSubviewAtIndex : i withSubviewAtIndex : j];

하지만 어떤 이유로 그것이 작동하지 않아 일부 하위보기가 사라집니다.

이제는 모든 하위보기를 제거하고 올바른 z 순서대로 다시 추가합니다. 2 세대 아이폰에서 50 개의 하위보기를 사용해도 괜찮습니다. 그러나 120 초가 걸리므로 게임 플레이가 싫증이납니다. 3GS 그래서 나는 거기에서 시험하지 않았다).

각 하나의 사각형이 사각형이므로 색상을 지정하고 크기를 조정하고 화면의 어딘가에 옮길 수 있기 때문에 하위 뷰를 많이 사용합니다. NSMutableArray 아래에 하위 뷰를 잡고 있어요 ...

답변

5

아이폰 설명서에서는 특정 시점 이후에 큰 성능이 발생하기 때문에 중첩 된 여러 UIView에 대해 경고합니다. 문제가 생기기 시작하는 경우 하나의 옵션은 UIView를 이미지로 렌더링 한 다음이를 사용하여 화면보기의 수를 줄이는 것이지만 3D를 시뮬레이트하는 경우 컴포지트보기 이후로는별로 도움이되지 않을 것입니다 너무 자주 다시 렌더링해야합니다.

iPhone은 3D 환경을 허용하는 OpenGL ES를 완벽하게 지원합니다. 주제에 대한 몇 가지 샘플 및/또는 좋은 책을 살펴보면 OpenGL을 사용하는 것이 훨씬 쉽다는 것을 알 수 있습니다.

2

Timothy가 제시 한 것처럼 OpenGL ES로 뛰어 들지 않으려면 UIView를 CALayers로 바꾸고 CATransformLayer 내에 배치하는 것이 좋습니다. CATransformLayer는 iPhone OS 3.0의 새로운 기능으로, CALayers의 진정한 3-D 레이아웃을 수행 할 수 있습니다. 그런 다음 CALayers의 zPosition 속성을 CATransformLayer의 Z 평면에서 찾을 수 있도록 설정할 수 있습니다. CALayers의 3D 레이아웃에 대한 자세한 내용은 this article으로 연결됩니다.

해당 레이어에 적용된 CATransform3D에서 전체 CATransformLayer에 대해 멋진 원근 효과를 setting the m34 element까지 추가 할 수도 있습니다.

구조가 공통점이 많기 때문에 UIView에서 CALayers로 변경하는 것은 매우 간단합니다.

1

과 같은 2D 게임 라이브러리 사용을 고려하십시오. 나는 Z-ordering을 지원하며, UIView를 사용하는 것보다 성능이 훨씬 우수 할 것이라고 확신한다.

4

Z 순서는 수퍼 뷰의 하위보기 목록에보기가 나타나는 아티팩트입니다. 수퍼 뷰에 추가 된 마지막 서브 뷰는 "맨 위에"있습니다.

뷰를 "맨 위"로 이동하려면 슈퍼 뷰에서 뷰를 제거한 다음 다시 추가하십시오. 마지막 뷰가되므로 맨 위에 추가하십시오.

여기에서보기는 자신을 z 순서의 맨 위로 이동합니다.

슈퍼 뷰가 유일한 참조 인 경우 자신의 탈퇴를 방지하려면 [자기 유지]에 유의하십시오.