2010-11-21 4 views
3

미디어 중심의 앱과 같은 잡지의 애니메이션 방식을 테스트하고 있습니다. 내 목표는 비디오 재생 Core Animation 애플리케이션에 대한 최적화 방법 제안 사항은 무엇입니까?

  • 및 애니메이션 화면을 통해 표준 UI 오버레이 스프라이트
  • 수백

    • 부드러운 애니메이션이다.

    코어 애니메이션 또는 OpenGL을 고려 중입니다.

    OpenGL은 확실히 빠르지 만, 알고있는 것처럼 GL 스프라이트 내에서 비디오 재생을 통합하는 것은 불가능합니다. (영상에 질감이 필요합니다.)

    그래서 Core Animation을 파고 있습니다. 그러나 성능이 너무 나빴습니다. 나는 11x10px, 알파 블렌드 비트 맵 스프라이트 중 256 개가있는 간단한 중력 시뮬레이션을 시도했다. 그리고 약

    • 초당 10 프레임
    • 5 % 장치 활용
    • 5 % 렌더러 활용
    • 0 % tiler 활용되었다.

    명백히 병목 현상은 CPU 코드에 있습니다.

    아시다시피 CA는 합성을 위해 GL을 사용하며 작은 비트 맵 하나만 사용했습니다. 따라서이 결과는 부당합니다. CA 프레임 워크 자체는 엄청난 오버 헤드를 가지고 있지만, 나는 그것이 어디에 있는지 그리고 어떻게 고칠 수 있는지 알 수 없다.

    최적화를 시도했습니다. 그러나 몇 가지 옵션 만있었습니다. 명시 적 트랜잭션을 시도하고 모든 추가 보간을 제거했습니다. 그러나 성능이 나아지지 않았습니다. 노골적인 애니메이션을 시도했지만 동작을 이해하는 것은 너무 어려웠습니다. 어쩌면 병목 현상이있을 수 있습니다.

    최적화 방법 제안? (CADisplayLink 호출 틱) :

    여기 내 똑딱 소스 코드의

    - (void)tick 
    { 
    [CATransaction begin]; 
    [CATransaction setAnimationDuration:0.0f]; 
    
    CGRect bounds = [hostLayer bounds]; 
    CGFloat gravity = +9.8f * 0.1f; 
    
    for (TestParticleSprite *tspr in spriteLayers) 
    { 
        CGSize mtn = [tspr motion]; 
        CGPoint ctr = [tspr position]; 
    
        mtn.height += gravity; 
        ctr.x += mtn.width; 
        ctr.y += mtn.height; 
    
        CGFloat over = ctr.y - bounds.size.height; 
        if (over > 0.0f) 
        { 
        // Hit the ground! 
        ctr.y = bounds.size.height - over; // Bounce. 
        mtn.height *= -1.0f;  // Bounce. 
    // mtn.width *= 0.95f;  // Lose energy. 
    // mtn.height *= 0.95f;  // Lose energy. 
        } 
    
        [tspr setMotion:mtn]; 
        [tspr setPosition:ctr]; 
        [tspr removeAllAnimations]; 
    
    // // Tried explicit animation, but it was unable to make it work. 
    // CATransform3D t = CATransform3DMakeTranslation(ctr.x, ctr.y, 0.0f); 
    // CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform"]; 
    // [anim setAdditive:NO]; 
    // [anim setCumulative:NO]; 
    //// [anim setFromValue:[NSValue valueWithCATransform3D:t]]; 
    // [anim setToValue:[NSValue valueWithCATransform3D:t]]; 
    // [tspr addAnimation:anim forKey:nil]; 
    } 
    
    [CATransaction commit]; 
    } 
    
  • 답변

    1

    상어합니다 (CHUD 도구의 일부)에서 코드를 실행하고 대부분의 시간이 소비되는 위치 참조 -이해야 귀하의 최적화 노력에 집중할 수있는 실마리를 제공합니다.

    +0

    감사합니다. 그러나 문제는 어디에서 수정해야하는지 모른다는 것입니다. 나는 내 지식으로 모든 방법을 시도했다. 그래서 나는 몇 가지 추가적인 최적화 방법을 묻고있다 :) (내 불명확 한 질문은 미안하다) – Eonil

    +0

    @Eonil : 상어와 함께 코드를 프로파일 링하는 요점은 "핫스팟"을 식별하는 것이다. - 시도해 보라. 왜 코드가 충분히 빠르게 실행되지 않는지 이해하고 코드의 비싼 부분을 최적화하는 구체적인 질문을 할 수 있습니다. –

    관련 문제