2012-05-22 5 views
1

OpenGL ES를 사용하여 iOS에서 맞춤 UI 프레임 워크를 작성하고 있습니다. 유스 케이스는 게임과 같이 프레임 단위로 업데이트되지 않는 것과 같이 애플리케이션을위한 것입니다. 지금까지 볼 수 있듯이 GLKViewController의 기본 동작은 약 30fps의 속도로 화면을 다시 그리는 것입니다. 일반적으로 리소스 사용을 줄이기 위해 필요한 경우 UI를 다시 그리기 만하면되므로 사용자가 아무 것도하지 않는 동안 GPU를 사용하여 여분의 배터리 전력을 소모하지 않아야합니다.iOS OpenGL ES - 요청시 그리기

테스트로 한 번만 화면을 지우고 그려 보았습니다. 프로파일 러에서 초기화되지 않은 컬러 버퍼가 표시되었다는 경고 메시지가 나타납니다. http://developer.apple.com/library/ios/#DOCUMENTATION/iPhone/Reference/EAGLDrawable_Ref/EAGLDrawable/EAGLDrawable.html

문서는 플래그가 YES로 설정 kEAGLDrawablePropertyRetainedBacking가, 후방 버퍼는 이전 프레임에 그려진 물건을 유지 할 수 있다는 것을 말한다 :

그것으로 찾고,이 문서를 발견했다. 그러나, 그것은 또한 권장하지 않으며 성능과 메모리 문제를 일으킨다 고 말합니다. 이것은 제가 처음부터 피하려고하는 것입니다.

나는 모든 방법을 시도하고 모든 프레임을 그릴 계획이지만,이 상황에 직면 한 사람이 있는지 궁금합니다. 무엇을 추천하나요? 프레임 당 30 번 모두 다시 그려야한다고 가정 할 때 큰 문제는 아닌가?

+1

GLKViewController를 사용해야합니까? OpenGL ES 호스팅보기 및 필요한 경우에만 새로 고치는보기 컨트롤러를 굴리는 것이 그리 어렵지 않습니다. 우리 모두가 pre-iOS 5.0을해야했습니다. –

+0

흥미 롭다. 나는 그것이 선택 사항이라는 것을 깨닫지 못했다. (나는 아이폰 OS 개발에 익숙하다.) 나는 그것을 들여다 볼 것이다. – phosphoer

+0

[이 응답] (http://stackoverflow.com/a/2858658/19679)의 몇 가지 샘플 응용 프로그램에 연결됩니다.이 응용 프로그램은 다른 응용 프로그램보다 간단합니다. 둘 다 자체적 인 사용자 정의보기 및보기 컨트롤러를 만들고 업데이트는 수동으로 또는 인터럽트 가능한 CADisplayLink를 통해 처리됩니다. –

답변

2

GLKViewController은 주 루프에 간단한 애니메이션 타이머를 제공하는 것이 목적이므로 GLKViewController을 사용하지 않아야합니다. 대신 자신의 뷰를 포함하는 UIViewController의 다른 하위 클래스에서 뷰를 소유 할 수 있으며 다른 모든 UIKit 뷰에서 사용하는 일반적인 setNeedsDisplay/drawRect 시스템에 의존 할 수 있습니다.

+0

답변을 주셔서 감사합니다. – phosphoer

1

이미지를 보유하는 후방 버퍼가 아니라 별도의 버퍼를 보유합니다. 아마도 당신의보기를 위해 특별히 만들어진 별도의 버퍼.

GLKViewController에 항상 paused을 설정하여 렌더링 루프를 일시 중지 할 수 있습니다.

+0

일시 중지 된 속성에 대해 알지 못 했으므로 매우 좋은 해결책입니다. 그렇게하면 (GLKViewControllerUpdate) 업데이트 루프도 일시 중지됩니까? – phosphoer

+0

예,'paused' 속성은'GLKViewController'가'GLKView'를 업데이트하고 렌더링하는 것을 멈 춥니 다. 이는 불규칙한 변경 (예 : 사용자 입력)을 기반으로 렌더링하지만'updateNeedsDisplay'를 사용하여 업데이트 타이머를 기반으로 애니메이션을 적용하려는 경우에 적합합니다. 예를 들어 무언가를 드래그하여 다시 놓으면 스프링 애니메이션이 끝날 때까지 컨트롤러를 일시 중지 한 다음 필요할 때까지 일시 중지합니다. – jhabbott

관련 문제