2014-12-08 8 views
0

이 앱은 OpenGL ES2 및 GLKit 프레임 워크와 GLKitViewController에서 제공하는 렌더링/업데이트 루프를 사용합니다. iOS7.1을 사용하여 iPad2에서 안정적으로 60fps로 실행 했었지만 iPad2를 iOS8.1로 업데이트하면 이제는 똑같은 코드가 56-59FPS 사이에서 변동합니다. (그러나 CPU 사용은 이전처럼 40-60 %로 유지됩니다.)OpenGL 앱의 프레임 속도는 iOS7.1에서 iOS8.1로 업그레이드 한 후 줄었습니다.

프로파일 링은 OpenGL 그리기 명령이 이전보다 훨씬 많은 CPU 시간을 사용하고 있음을 나타냅니다. 가장 큰 변화는 "GLKBaseEffect prepareToDraw"에 대한 호출이 이전보다 훨씬 오래 걸린다는 것입니다.

(이 응용 프로그램은 렌더링 루프 동안 여러 지점에서 재구성되는 단일 GLKBaseEffect를 사용하므로 매번 prepareToDraw에 대한 호출이 필요합니다.) GLKBaseEffect의 여러 인스턴스를 사용하여 최적화 할 수 있다는 것을 알았습니다. 그러나 나중에는 성능을 iOS7.1에서 견고했습니다.)

"GLKBaseEffect prepareToDraw"에 의해 생성 된 OpenGL 호출을 확인하기 위해 Instruments의 OpenGL ES Analyzer 추적을 검토하고 있습니다. 어떤 것이 비정상적으로 보이는지 확인하고, 일단 아무 것도 알아 내지 못하면 게시물을 업데이트 할 것입니다.

이 시점에서 진행 방법에 대한 지침에 대해 매우 감사드립니다. GLKBaseEffect prepareToDraw에 대한 호출이 iOS8.1에서 더 오래 걸리는 이유는 무엇입니까?

+0

중요한 회귀 사실을 발견 한 경우 버그 인 경우를 대비하여 Apple (https://bugreport.apple.com)에 로그인해야합니다. 예제 코드를 제공하면 도움이 될 것입니다. 또는 기술 지원 사건 (TSI)을 사용하여 Apple 엔지니어가 귀하를 직접 도울 수 있는지 확인하십시오. 또한, 느린 OpenGL에 대한 SO 게시물 : http://stackoverflow.com/q/22562091/558933 –

+0

@RoboticCat 감사합니다. 나는 보고서를 제출할 수 있다면 iOS7.1 장치에 대한 비교 테스트를 시도하고 수행 할 것입니다. OpenGL Analyzer 추적은 특별한 것이 없었습니다. prepareToDraw에 의해 생성 된 GL 명령은 현명한 것 같았지만, 내일 아침에 여기에서 아주 늦게 다시 검사 할 것입니다. 나는 TSI도 알지 못했다. 고마워. – Amral

+0

GLKBaseEffect prepareToDraw가 glGetIntegerv (GL_CURRENT_PROGRAM, ...) 및 glGetUniformLocation()에 대한 불필요한 호출을 많이 생성하고 있음을 확인할 수 있습니다. 예를 들어, 프로그램이 다시 링크되지 않으면 유니폼 위치가 변경되지 않으며 GLKBaseEffect가 CPU 액세스 메모리에서 이러한 위치를 캐시 할 것으로 예상됩니다. 그러나 iOS7에서 동일한 호출이 생성되는지 여부는 알 수 없으므로 문제가되지 않을 수 있습니다. – Amral

답변

0

문제의 원인은 Jim Hillhouse에 의해 확인되었으며 Apple 개발자 포럼 스레드 "OpenGL Performance Drops > 50% in iOS 8 GM"에서 Frogblast에 의해 확인되었습니다. GLKView의 하위보기 인보기에서 UITextField (또는 UILabel, 내 경우에는)의 텍스트 속성을 설정합니다. GLKView 수퍼 뷰가 레이아웃에 영향을 주어 프레임 버퍼가 할당 해제되고 재 할당됩니다. 이것은 iOS 7에서는 일어나지 않았습니다.

Jim Hillhouse의 해결 방법은 UIViewController 내에 서브 뷰를 배치하고 GLKView에 임베드하는 것입니다. 보기 컨트롤러를 보유하기 위해 컨테이너보기를 사용하여 동일한 작업을 수행했으며 작동하는지 확인할 수 있습니다.