2011-08-11 3 views
0

작은 앱을 쓰려고하는데, 주 ​​화면에서 나는 "거품"을 움직입니다. 이 애니메이션은 연속적이어야합니다. (화면에서 날아 오는 거품을 재사용) UI를 변경하는 모든 작업과 마찬가지로 애니메이션이 주 스레드에서 실행되어야한다고 들었습니다. 사실입니까? 이 스크린에 UIAlertView를 보여 주려고하면 연속 버블 애니메이션 때문에 애니메이션이 매우 담론 적으로 변합니다. (이것은 표시기가있는 사용자 정의 alertview입니다.) 장치는 iPhone 4이므로 정상적인 UIAlertView를 표시하는 것이 문제가 아닐 것이라고 생각합니다.연속 애니메이션이 적용되는 UClertView 애니메이션?

거품 애니메이션에 올바른 방법을 사용하고 있는지 물어보고 싶습니다. 먼저 NSTimer를 사용합니다. NSTimer는 매 0.01 초마다 startAnimation 메서드를 호출합니다 (컨트롤러의 viewDidAppear: 메서드에서 시작). startAnimation 메서드에서 처음에는 임의의 x 및 y 좌표 (화면에서 풍선을 viewdidappear 직후에 볼 수 있음)가있는 거품을 생성하고 임의의 x 및 y = 460 좌표로 거품을 생성합니다. startAnimation 메서드에서는 프레임 (frames)이라는 카운터를 실행하고이 카운터의 값이 35 일 때 거품 생성 메서드를 다시 호출합니다. I 배열에 발생하는 기포를 저장

, 다른 배열 (화면 떠난다)가 '사라'거품 :

문제. 먼저 배열을 없애면 버블을 재사용하려고 시도합니다. 배열이 다 떨어지면 새로운 버블이 생깁니다. 이 작업이 처리되는 동안 연속 애니메이션이 중지 된 다음 계속됩니다. 휴식 시간은 약 1 초이지만 이것은 매우 혼란 스럽습니다. 누구든지이 문제를 해결할 수 있습니까? 조언 감사는 머그잔 클래스에서

- (void)viewDidAppear { . timer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(startAnimation) userInfo:nil repeats:YES]; . } - (void)startAnimation { self.current = [NSDate timeIntervalSinceReferenceDate]; double diff = (self.start - self.current); if (diff < 0) { diff = (-1) * diff; } self.start = self.current; frames++; if (shouldMoveBubbles) { [mug moveBubbles:diff]; } if (frames == 35) { DebugLog(@"################################################################"); DebugLog(@"####################### FRAME = 35 ###########################"); DebugLog(@"################################################################"); [mug createNewBubbleOnTheBottomOfView:self.view]; frames = 0; } } 

을 madik :

- (void)moveBubbles:(double)millisElapsed { 

    for (Bubble *bubble in bubbles) { 

     int bubbleSpeed = bubble.speed; 

     float deltaX = (float)(bubbleSpeed * -degrees_sinus * millisElapsed * 100); 
     float deltaY = (float)(bubbleSpeed * -degrees_cosinus * millisElapsed);   

     DebugLog(@"movebubbles x: %f, y:%f, speed: %d, sin:%f, cos:%f", deltaX, deltaY, bubbleSpeed, degrees_sinus, degrees_cosinus); 

     [bubble moveBubbleX:deltaX Y:deltaY]; 
    } 
} 

그리고 버블 클래스 :

- (void)moveBubbleX:(float)deltaX Y:(float)deltaY { 
    self.bubbleImage.center = CGPointMake(self.bubbleImage.center.x + deltaX, self.bubbleImage.center.y + deltaY); 
} 
+0

이 상황에서 "담론 적"이란 무엇을 의미합니까? – Moshe

+0

활동 표시기로 경고보기를 상상해보십시오. 그것을 보여 주려고 할 때 (버블 애니메이션 기억) 매우 느리게 표시됩니다. 활동 표시기의 애니메이션이 움직이지 않고 고정되어 있으며 경고보기를 닫을 때 매우 느리게 사라집니다. 따라서 전체 과정은 매우 느립니다. – madik

+0

맞아. 메모리 문제 같아. 이 것을 하나의 것으로 분류하기 위해서'Build and Analyze'를 사용할 것을 제안합니다. – Moshe

답변

2

이것은 메모리 문제처럼 들린다. 느린 UIAlertView 애니메이션이 이에 대한 확실한 신호입니다. 거품을 발생시키는 방식으로 문제가 발생하는 것 같습니다. 당신은 거품의 두 배열을 유지 언급했다. 한 번에 두 배열에있을 수있는 거품의 수를 제한하면 결코 말하지 않습니다. 당신은 또한 당신이이 거품을 정화 할 때 언급하지 않는다. 그것은 메모리 "블랙홀"처럼 들립니다. 한 번에 화면에 표시 할 수있는 최대 거품 수를 설정하는 것이 좋습니다.

사용자 지정 경고보기도 언급됩니다. UIAlertView를 수정하고 있다면 공식적으로 지원되지 않기 때문에 문제가 발생할 것입니다. 또한, 메모리가 부족하면 UIAlertView 애니메이션이 느려지는 것을 보았습니다. 거품으로 메모리 문제를 푸는 경우이 문제도 해결할 수 있습니다.

마지막으로 한마디 조언. UIKit에서 애니메이션 게임을 만드는 것은 좋은 생각이 아닙니다. NSTimers는 많은 사람들이 생각하기에 정확하지 않습니다. UIImages는 상대적으로로드하는 데 비용이 듭니다. 움직이는 버튼을 만지는 것은 최악의 경우 신뢰성이 떨어지는 것으로 알려져 있으며 최고 수준의 해킹을 제공합니다. Cocos2d-iphone과 같은 게임 프레임 워크를 살펴 보는 것이 좋습니다.

행운을 빈다.

관련 문제