2011-03-08 3 views
0

프로젝트를 만들었습니다. 이미지의 세 그룹이 표시되어야하며 모든 그룹에는 다섯 개의 이미지가 있습니다. 앱에서 0.2 초마다 이미지가 한 번 변경됩니다. 이고 이미지의 크기는 30 * 30이므로 화면에 약 80 개의 이미지가 있으며 모두 애니메이션을 가지고 있습니다. 그러나 이것을 테스트 할 때 fps가 0.8 초가 될 것으로 보이지만 매우 느립니다.fps에 관한 문제

모든 이미지는 하나의 UIView에서 그려집니다. 나는 method - (void) drawRect에서 [image drawInRect :]를 사용한다. fps를 더 빠르게 만드는 제안이 있습니까?

답변

0

화면에 80 UIImageView을 넣으려고 했습니까? 필요한 경우에만 각각에 새 이미지를 설정하면 개선 된 것을 볼 수 있습니다.

UIView에는 각각 CALayer이 필요하며, 필요에 따라 그래픽 메모리에 복사됩니다. 픽셀을 복사하는 것은 꽤 느립니다 (그러나 캐시 된 후에는 캐시 됨). 따라서 한 번에 하나의 30x30 타일 만 업데이트하면 화면을 지속적으로 업데이트하는 것보다 더 나은 성능을 볼 수 있습니다.

물론 하나의 UIView에서 80 개의 CALayers를 수동으로 관리 할 수 ​​있지만 80 UIImageView을 사용하는 것보다 훨씬 어려울 수 있습니다.

-(void)drawRect을 무시하면 CALayers가 그래픽 메모리와 상호 작용하는 방식 때문에 성능이 크게 저하 될 수 있습니다. iPhone의 Quartz 그래픽 시스템은 그래픽 명령 (변형, 불투명도 등)으로 조작 할 수있는 것보다 많은 정적 레이어가있는 데 최적화되어 있습니다.

+0

아니요 UIImageView를 사용하지 않습니다. 난 그냥 UIView에서 모든 이미지를 그릴 drawRect 메서드를 사용합니다. 다른 UIView가 없습니다. 총 이미지는 단지 80 개가 아닙니다. 그것은이 카운트보다 훨씬 더 많을 수도 있습니다. 80은 하나의 UIView에서 최대 카운트입니다. – toad

+0

당신이하지 않는다는 것을 알고 있습니다, 당신이 시도해 볼 것을 제안합니다. –

0

프로필. Instruments 응용 프로그램을 사용하여 코드 중 가장 느리게 실행되는 부분을 찾은 다음 속도를 높이거나 자주 호출하지 않는지 여부를 확인하십시오. 예를 들어, 항상 모든 이미지를 다시 그릴 필요가 있습니까? 코어 애니메이션 또는 OpenGL ES를 사용하여 동일한 동작으로 코코아 터치 코드를 대체 할 수 있습니까?

반복. 일단 조정하면 다시 프로파일 링하십시오. 좋아 졌니? 만약 그렇다면 속도를 높이기 위해 다음 것을 찾으십시오. 그렇지 않은 경우, 그것이 모두 도움이되었거나 되돌려 야하는지 결정하십시오.

0

글쎄, 무언가를 그릴 때마다 ... 작품입니다 ... 처음에는 모든 이미지를로드 한 다음 화면에 스왑하고 (UIImageView 숨기기/표시) 더 나은 퍼포먼스를 얻을 수 있습니다. 이미지가 너무 작 으면 메모리 문제가 없습니다 ...