Apenas no novo iPad 3: wait_fences: não recebeu resposta: 10004003

Então eu sei que há muitas perguntas sobre isso, mas até onde eu posso dizer, esta é uma situação única, então eu imaginei que iria postar. Espero que isso adicione algumas informações que podem nos dar uma resposta do porque isso está acontecendo conosco. Estou recebendo o erro: wait_fences: não recebi resposta: 10004003, quando meu dispositivo gira. A animação das minhas visualizações é iniciada a partir de:

- (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration

Eu só estou recebendo o erro no novo iPad 3. Eu usei exatamente o mesmo programa em um iPad original e iPhones tão baixo quanto um 3GS. Todos eles não recebem o erro wait_fences e todos eles rodam mais rápido que o iPad 3.

Eu uso Core Graphics quase exclusivamente para desenhar os pontos de vista. Eu também garanto que eles serão redesenhados em um redimensionamento para que eu não tenha visualizações pixeladas. Se eu desabilitar o redesenho no redimensionamento, não recebo esse erro (mas recebo visualizações estendidas). Se eu desabilitar completamente o desenho gráfico principal, não recebo o erro (mas, claro, recebo exibições em preto).

Eu usei o Time Profiler e descobri que o hangup estava principalmente nos gradientes de desenho:

Eu alterei o código para preencher em vez de desenhar gradientes e isso alivia o problema. Eu diria que os gradientes são o problema, exceto que eu faço essas animações em outras situações (além da resposta à rotação) e funciona muito bem.

Também gostaria de observar que prestei especial atenção em garantir que eu apenas anime as exibições que estão realmente na tela. Eu sei que animar exibições fora da tela às vezes pode causar esse erro ocorrer.

Eu não incluí o código de animação

Alguma idéia de por que isso está acontecendo? Especialmente porque está acontecendo apenas no iPad 3?

Para quem vai perguntar, esse é o código que realiza a animação. Normalmente será envolvido em um bloco de animação UIView.

- (void) setFramesForFocusView:(CustomControl *)focusView atX:(CGFloat)x showInput:(BOOL)showInput{
    CGSize bSize = self.bounds.size;
    CGRect fRect = focusView.frame;
    fRect.size.width = bSize.width;

    CGRect iRect;
    if (focusView.inputViewIsSystemKeyboard){
        if (_keyboardRect.origin.y < 0 || _keyboardRect.origin.y >= CGRectGetMaxY(self.bounds) || CGRectIsEmpty(_keyboardRect) || CGRectGetMaxY(_keyboardRect) > CGRectGetMaxY(self.bounds)) return;
        iRect = _keyboardRect;
    } else {
        iRect = (focusView.inputUIView && showInput) ? CGRectMake(0, bSize.height / 2, bSize.width, bSize.height / 2) : CGRectZero;
    }

    CGRect iaRect = focusView.inputAccessoryUIView.frame;
    CGFloat availableFieldHeight = iRect.origin.y - iaRect.size.height;

    iRect.size.width = bSize.width;
    iaRect.size.width = bSize.width;

    if (!showInput){
        iRect.origin.y = bSize.height;
    }
    iaRect.origin.y = iRect.origin.y - iaRect.size.height;

    iRect.origin.x = x;
    iaRect.origin.x = x;
    focusView.inputUIView.frame = iRect;
    focusView.inputAccessoryUIView.frame = iaRect;

    if (focusView.expandInput){
        fRect.origin.y = 0;
        fRect.size.height = availableFieldHeight;
    } else {
        if (focusView.labelPlacement != LabelPlacementTop && focusView.labelPlacement != LabelPlacementBottom){
            fRect.size.height = _currentView.storedFrame.size.height + [focusView.label.text sizeWithFont:focusView.label.font].height; 
        }
        fRect.origin.y = availableFieldHeight - fRect.size.height;
    }
    if (fRect.size.height > availableFieldHeight){
        fRect.origin.y = 0;
        fRect.size.height = availableFieldHeight;
    }
    fRect.origin.x = x;
    [focusView setLabelPlacement:LabelPlacementTop toFrame:fRect];
}

questionAnswers(1)

yourAnswerToTheQuestion