Tylko na nowym iPadzie 3: wait_fences: nie udało się odebrać odpowiedzi: 10004003

Wiem więc, że jest wiele pytań na ten temat, ale o ile mogę powiedzieć, że jest to wyjątkowa sytuacja, pomyślałem, że opublikuję to. Mamy nadzieję, że doda to trochę informacji, które w końcu mogą dać nam odpowiedź na pytanie, dlaczego tak się dzieje. Dostaję błąd: wait_fences: nie udało się odebrać odpowiedzi: 10004003, gdy moje urządzenie obraca się. Animacja moich widoków rozpoczyna się od:

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

Błąd pojawia się tylko na nowym iPadzie 3. Użyłem dokładnie tego samego programu na oryginalnym iPadzie i iPhone'ach tak niskich jak 3GS. Wszystkie nie otrzymują błędu wait_fences i wszystkie obracają się szybciej niż iPad 3.

Używam Core Graphics prawie wyłącznie do rysowania widoków. Zapewniam też, że zostaną one ponownie narysowane na zmianie rozmiaru, więc nie będę miał widoków z pikselami. Jeśli wyłączę odświeżanie przy zmianie rozmiaru, nie otrzymuję tego błędu (ale otrzymuję rozciągnięte widoki). Jeśli całkowicie wyłączę rysowanie grafiki rdzenia, nie otrzymuję błędu (ale oczywiście otrzymuję czarne widoki).

Korzystałem z narzędzia Time Profiler i dowiedziałem się, że zawieszanie dotyczyło głównie rysowania gradientów:

Zmieniłem kod, aby wypełnić, a nie rysować gradienty, a to łagodzi problem. Powiedziałbym, że gradienty są problemem, z wyjątkiem tego, że robię te animacje w innych sytuacjach (innych niż w odpowiedzi na obrót) i działa dobrze.

Chciałbym również zauważyć, że szczególną uwagę zwróciłem na to, aby zapewnić animację tylko tych widoków, które są na ekranie. Wiem, że animowanie widoków poza ekranem może czasami powodować wystąpienie tego błędu.

Nie umieściłem kodu animacji

Jakieś pomysły, dlaczego tak się dzieje? Zwłaszcza, że ​​dzieje się to tylko na iPadzie 3?

Dla tych, którzy będą pytać, jest to kod, który wykonuje animację. Zwykle będzie zawinięty w blok animacji 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