2008-10-02 1 views
2

저는 플레이어가 렌즈 (예 : 돋보기)를 통해 비행기 (예 : 벽)를 볼 수있게해야하는 게임을하고 있습니다. 게임은 iPhone에서 실행되므로 내 선택은 Core Animation 또는 OpenGL ES입니다.2D 장면에서 "돋보기"를 만드는 가장 좋은 방법은 무엇입니까?

내가 아직 시도하지 않은 첫 번째 아이디어는 Core Animation을 사용하는 것입니다.

  1. 벽과 개체를 CALayers를 사용하여 만듭니다.
  2. CALayer의 renderInContext: 메서드를 사용하여 벽의 이미지를 배경 레이어로 만듭니다.
  3. 이미지를 렌즈 모양으로 자르고 크기를 조정 한 다음 배경 위에 그립니다.
  4. 렌즈 프레임과 "반짝이는 유리"레이어를 그 위에 모두 그립니다.

참고 :

  • 나는 어쩌면 OpenGL을 함께 할 수있는 더 나은 방법이, 더 많은 OpenGL을보다 더 코어 애니메이션에 익숙한입니다. (제발 말해!)
  • 보기에 첨부되지 않은 CALayers를 사용하는 경우 모든 애니메이션을 직접 관리해야합니까? 아니면 수동으로 실행할 수있는 간단한 방법이 있습니까?
  • 3D 퍼스펙티브는 중요하지 않습니다. 나는 단지 평면 벽을 확대하고있다.
  • 위의 모든 작업을 원활하게 수행하기에는 너무 느리다는 것에 우려하고 있습니다.

이 글을 쓰려면 많은 코드를 작성하기 전에 질문에 위의 계획에서 함정이 보이거나 더 쉬운 방법을 권장 할 수 있습니까?

답변

2

이것이 내가하는 방법입니다. 좋은 계획 같아요.

OGL을 선택하든 CA를 선택하든간에 기본 원칙은 동일하므로 더 편하게 생각해보십시오.

  1. 표면
  2. 의에 당신이
  3. 는 별도의 표면
  4. 어떤 테두리/오버레이를 렌더링하기 위해이 지역을 렌더링 확대하고자하는 영역을 식별 귀하의 표면은 적절하게 클리핑, 주요 장면에 확대 렌더링합니다.

성능 측면에서 보면 시뮬레이터가 하드웨어보다 훨씬 빠르기 때문에 실제 하드웨어에서 테스트해야합니다. 그것이 느린 경우 2/3 단계를 덜 빈번하게 볼 수 있습니다 (예 : 2-3 프레임). 이것은 약간의 배율 래그를 줄 것이지만 완벽하게 받아 들일 수 있습니다.

OGL/CA 간의 성능은 대략 동일하다고 생각됩니다. CA는 OGL 라이브러리의 ontop에 내장되어 있지만 비용은 레이어에서 소비 된 시간이 아닌 실제 렌더링을 수행하게됩니다.

+0

CA는 OGL보다 훨씬 느립니다. 진도는 실제로 느려집니다. – lajos

+0

어떻게 당신의 인물을 얻었습니까? 원시 이미지 합성의 측면에서, 그건 내 경험이 아닙니다. 병목 현상은 이미지를 래스터 화하는 데 소요되는 시간입니다. –

+0

나는 CALayers와 UIView의 애니메이션을 테스트했다. 어떤 이유로 UIViews 훨씬 빨라졌습니다. – lajos

3

iPhone에서 UIView를 사용하여 돋보기가 구현되었습니다. CA는 너무 느립니다.

drawView를 사용하여 UIView에 CGImage를 그릴 수 있습니다.여기 제의 drawRect의 단계입니다 :

  1. 현재 컨텍스트
  2. 가 (원)
  3. 규모보기를 클리핑에 대한 경로를 만들 수 현재 변환 행렬 (CTM)
  4. 이동 현재의 변환 행렬
  5. 당신은의 CGImage 미리 렌더링을 가질 수의 CGImage

을 그려, 다음은 그래픽 메모리입니다. 동적 인 것을 원하면 CGImage를 그리는 대신 처음부터 그립니다.

매우 빠르며 멋지게 보입니다.

+0

돋보기 렌즈가 배경보기의 하위보기라고 말하고 있습니까? CA보다 빠르다고 말하지만 CA로 무엇을하는 것보다 빠릅니다. 당신은 매우 불분명합니다. – benzado

+0

내 앱에서 돋보기가 터치를 따릅니다. 내가 CA를 사용해 보았을 때, UIView 구현보다 덜 반응했습니다. 확대 된보기는 배경보기의 하위보기입니다. – lajos