2012-07-25 3 views
0

나는 UIImageviews의 레이어를 약간 이동하여 약간의 깊이 인식을 얻는 데 사용하는 가속도계가 있습니다.가속도계의 성능 문제

여기 내 viewdidload 메서드 내에서 애니메이션과 가속도계를 인스턴스화하는 데 사용하는 코드입니다. 아이 패드가 성능 문제가 발생하기 시작하면서, 후행 시작 후

-(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration{ 

self.difference = 0 - acceleration.y; 

if (fabsf(self.difference) > 0.01) { 
    for (int i = 0; i < self.accLayerPoints0.count; i++) { 
     NSValue *val = [self.accLayerPoints0 objectAtIndex:i]; 
     CGPoint origin = [val CGPointValue]; 

     float x = origin.x + (acceleration.y * ACC_LAYER0_THRESHOLD); 
     [animateLayer0 setToValue:[NSValue valueWithCGPoint:CGPointMake(x, origin.y)]]; 
     UIImageView *layer0 = [self.accLayerObjects0 objectAtIndex:i]; 
     [layer0.layer addAnimation:animateLayer0 forKey:nil]; 

    } 

    for (int i = 0; i < self.accLayerPoints1.count; i++) { 
     NSValue *val = [self.accLayerPoints1 objectAtIndex:i]; 
     CGPoint origin = [val CGPointValue]; 

     float x = origin.x + (acceleration.y * ACC_LAYER1_THRESHOLD); 
     [animateLayer1 setToValue:[NSValue valueWithCGPoint:CGPointMake(x, origin.y)]]; 
     UIImageView *layer0 = [self.accLayerObjects1 objectAtIndex:i]; 
     [layer0.layer addAnimation:animateLayer1 forKey:nil]; 
    } 

    for (int i = 0; i < self.accLayerPoints2.count; i++) { 
     NSValue *val = [self.accLayerPoints2 objectAtIndex:i]; 
     CGPoint origin = [val CGPointValue]; 

     float x = origin.x + (acceleration.y * ACC_LAYER2_THRESHOLD); 
     [animateLayer2 setToValue:[NSValue valueWithCGPoint:CGPointMake(x, origin.y)]]; 
     UIImageView *layer0 = [self.accLayerObjects2 objectAtIndex:i]; 
     [layer0.layer addAnimation:animateLayer2 forKey:nil]; 
    } 
    } 
} 

내 문제는 : 여기

UIAccelerometer *accelerator = [UIAccelerometer sharedAccelerometer]; 
accelerator.delegate = self; 
accelerator.updateInterval = 0.1f; 

animateLayer0 = [CABasicAnimation animationWithKeyPath:@"position"]; 
animateLayer1 = [CABasicAnimation animationWithKeyPath:@"position"]; 
animateLayer2 = [CABasicAnimation animationWithKeyPath:@"position"];  
animateLayer0.duration = 0.1; 
animateLayer0.fillMode = kCAFillModeForwards; 
animateLayer0.removedOnCompletion = false; 
animateLayer1.duration = 0.1; 
animateLayer1.fillMode = kCAFillModeForwards; 
animateLayer1.removedOnCompletion = false; 
animateLayer2.duration = 0.1; 
animateLayer2.fillMode = kCAFillModeForwards; 
animateLayer2.removedOnCompletion = false; 

는 가속도계 기능의 코드입니다. Allocations 도구를 사용하여 문제를 일으키는 가속도계 기능의 코드인지 확인했습니다.

더 이상 사용하지 않는 객체를 해제하거나 코드를 삭제할 수있는 방법이 있습니까? 나는 ARC를 사용하고있어 청소 방법이 확실하지 않습니다.

답변

1

할당이 문제라고 생각하지 않습니다. 시간 프로파일 러를 사용하면 모든 가속도계 활동으로 메인 스레드를 차단하고 있음을 알 수 있습니다. 모든 단일 가속도계 이벤트에 대해이 모든 작업을 매우 긴밀한 루프로 수행하고 있습니다.

위치 계산을 백그라운드 큐에 넣고 주 스레드에서 UI 개체의 위치를 ​​업데이트하는 것을 고려하십시오 (이 부분은 일반적으로 백그라운드 대기열에서 UI를 업데이트하는 것이 안전하지 않으므로이 부분이 필요합니다). 실제 UI 업데이트 명령을 기본 대기열에 보내면됩니다. 어쩌면 깔때기 지점 (-updateUIWithDictionaryContainingComputedPositionsForEachLayer :, 메인 큐에서 백그라운드 계산 값으로 호출)을 만들 수 있습니다.

모든 단일 가속도계 이벤트이 일 필요가 의심 스럽습니다. 그랜드 센트럴 디스패치 (Grand Central Dispatch)도 도움을 줄 수 있습니다. 또는 간단한 카운트 다운 - 새 이벤트 NSTimer를 다시 시작합니다. 따라서 모든 단일 이벤트가 처리되는 것은 아닙니다. 지각적인 '스위트 스폿'을 부드럽게 보이는 애니메이션과 효율적인 응답 사이의 균형으로 찾으려면 실험을해야하지만 원활한 시각 효과에 필요한 업데이트 수가 가속도계 이벤트 수보다 훨씬 적습니다. 너 처리 중이야.

+0

GCD에 대한 몇 가지 검색을 수행했으며 NSOperation에 대한 많은 참고 자료를 발견했습니다. 왜 대신 GCD에 대해 언급 했습니까? 또한 나는이 두 가지가 어떻게 작용 하는지를 알아낼 수 없다. (여전히 멍청한 놈) 나에게 내 대답으로 이어질 좋은 튜토리얼을 알고 계신가요? – Fellowsoft

+0

GCD를 사용하면 예약 작업을보다 세밀하게 제어 할 수 있습니다. 당신은 문서로 잠수하고 당신이 별도로 가지고있는 특정 질문을 게시해야 할 것입니다. 위의 방법은 일반적으로 이동하는 방법이지만 정확하게 구현하는 방법은 단일 응답에 맞추기에는 너무 광범위합니다. –