2009-12-03 3 views
0

나는 빈의 OpenGL ES 응용 프로그램에 크게 기반으로 아이폰에서의 OpenGL ES 1.1 프로젝트는 여기에 준 : 나는에 테스트하고 있습니다아이폰의 OpenGL ES : 타이머 기반 그리기 문제, jitteryness

http://iphonedevelopment.blogspot.com/2009/06/empty-opengl-es-application-project.html

3G (3GS가 아님) 장치, 8GB.

OpenGL 작업을 수행하는 내 응용 프로그램의 페인트 루프는 화면을 렌더링 할 때마다 상당히 많은 작업을 수행합니다. 그러나 각 페인트 사이클에서 동일한 작업을 수행하는 상황에서 가변 프레임 속도가 나타납니다. 페인트 코드를 발사하는 NSTimer를 초당 30 번 발사하도록 설정했습니다. 즉 0.0333 초마다 실행됩니다. 가장 큰 문제점은 내 실제 페인트 코드가 벽 시간과 관련하여 한 페인트를 실행하는 데 대략 소요되는 시간이 다르기는하지만 분명하지는 않지만 시간이 오래 걸리는 경우가 있습니다. 신중한 로깅을 사용하여 최대 시간 간격이보고되면, 필자의 페인트가 완료되기까지 0.23 초가 소요되는 것을 볼 수 있습니다. 이는 4FPS와 같은데, 30FPS와 비교하면 5 프레임의 애니메이션/사용자 상호 작용을 건너 뛰는 것과 같습니다. isn 매우 받아 들일 수 없다.

처음에는 내 페인트 루프가 일부 잠금 장치에 걸려있는 것 같았습니다 (GL이 메인 스레드 (필수 AFAIK)에 들어 오기 때문에 들어오는 이벤트 처리가 있음)하지만 일부 미세한 입도로 로깅을하면 한 번의 페인트 코드 실행 사이클에서 기본적으로 거의 수행하지 않는 코드와 GL 작업이 아닌 많은 시간이 걸리는 것으로 나타났습니다.

내 GL 드로잉 스레드 (즉, 메인 스레드)와 약간의 차이가 있습니다. 내 응용 프로그램에서 통신이 있고 그 문제가 있는지 보려면 통신을 사용할 수 없게되지만 - 매번 동일한 그림을 할 때 내 그림의 실행 시간에 여전히 "스파이크"가 나타납니다.

다른 스레드가 내 페인트 코드로 돌아 오기 전, 시대에 따라 중간 페인트 코드로 전환되는 것처럼 보입니다.

어떻게 진행되고 있는지 더 자세히 분석 할 수있는 아이디어가 있습니까? NSTimers가 완벽하지 않고 보장 된 빈도가 아니라는 것을 압니다. 그러나 여기에서 주요한 문제는 실제 페인트 사이클이 때로는 단지 다른 스레드가 전환되기 때문에 영원히 걸리는 것입니다 ...

+0

난 그냥 명확히하기 위해, 영업 해요 : 로그를 검사하는 것은 나이를 취 내 페인트 코드에는 '결정적 증거'부분이 없다는 것을 알 수있다. 페인트 코드의 다양한 비트는 여러 다른 시간에 완료하는 데 오랜 시간이 걸리기 때문에 때로는 내 페인트 코드가 중간 흐름에 '인터럽트'된 것처럼 보입니다. –

+0

OP 다시. 페인트 루프를 실행하기 위해 NSTimer를 사용하는 것이 왜 나쁜 생각 일 수 있는지 유익한 게시물을 발견했습니다. 즉, 사용자 터치 반응이 실패 할 수 있습니다. 'igalic'의 게시물 검색 : http : //www.idevgames. com/forum/showthread.php? t = 15873 –

답변

0

"메인 루프"와는 아무런 관련이없는 응용 프로그램이 "멈추는"것처럼 보일 수 있습니다. 그것은 당신이 멀티 태스킹을하고 있기 때문입니다 ... 그리고 paticular에서 전화 확인 이메일만큼이나 간단한 문제가 이런 종류의 문제를 일으킬 수 있습니다. 어쨌든 아이폰에서 하나의 큰 원인은 다른 셀 사이트 (예 : 지하철이나 자동차에있는 것처럼)를 통과 할 때 때로는 스파이크를받을 수 있습니다.

아이폰 사용자는 비행기 모드를 사용해 문제가 없는지 확인하십시오.

- 데이비드

+0

안녕하세요, David, 답장을 보내 주셔서 감사합니다. 우리는 실제로 비행기 모드를 사용해 왔으며 모든 통신이 비활성화되어 있습니다 (NSURLConnection을 통해 sycnhronous 통신 요청을 시작하는 다른 스레드가 있지만 한 번에 하나의 요청 만). 우리는 여전히 '스파이크'를 occaisonally (하지만 나쁘지는 않습니다.) NSTimer를 사용하지 않는 전략이 도움이 될 것입니다. 이것은 iPhone OpenGL 성능에 대한 매우 흥미로운 슬라이드 세트이며 "NSTimer as paint loop timer"문제를 해결합니다. http://www.slideshare.net/llopis/squeezing-every-drop-of- iPhone 출력 성능 향상 –

+0

새로운 DisplayLink 기능은 NSTimers의 위상 문제와 디스플레이 새로 고침으로 인해 특히 추가되었습니다. 그러나 큰 스파이크 (> 2x 단일 프레임 시간)가 발생하지는 않습니다. –