2012-06-07 2 views
2

Так что я знаю, что в этом есть много вопросов, но насколько я могу судить об этом, это уникальная ситуация, поэтому я решил, что опубликую ее. Надеемся, что это добавит некоторую информацию, которая, наконец, даст нам ответ на вопрос, почему это происходит с нами. Я получаю сообщение об ошибке: wait_fences: не удалось получить ответ: 10004003, когда мое устройство вращается. Анимация моих взглядов инициируются:Только на новом iPad 3: wait_fences: не удалось получить ответ: 10004003

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

я только получаю ошибку на новом IPad 3. Я использовал ту же самую программу на оригинальном IPad и айфонов, как низко как 3GS , Все они не получают ошибку wait_fences, и все они вращаются быстрее, чем iPad 3.

Я использую Core Graphics почти исключительно для рисования представлений. Я также гарантирую, что они будут перерисовываться при изменении размера, поэтому я не получаю pixilated views. Если я отключу перерисовку при изменении размера, я не получу эту ошибку (но получаю растянутые представления). Если я отключу основной графический чертеж, я не получу ошибку (но, конечно, я получаю черные виды).

Я использовал Time Profiler и обнаружил, что зависание в основном в градиентах рисования: enter image description here

Я изменил код, чтобы заполнить, а не выдвижные градиентов и делает разрешить эту проблему. Я бы сказал, что градиенты - это проблема, за исключением того, что я делаю эти анимации в других ситуациях (кроме как в ответ на вращение), и это работает отлично.

Я также хотел бы отметить, что я уделил особое внимание тому, чтобы убедиться, что я только анимация видов, которые на самом деле на экране. Я знаю, что анимация просмотров с экрана иногда может вызвать эту ошибку.

Я не включил код анимации

Любые идеи, почему это происходит? Тем более, что это происходит только на iPad 3?

Для тех, кто спросит, это код, который выполняет анимацию. Он обычно будет завернут в блок анимации 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]; 
} 
+4

Тот факт, что его единственное происшествие на iPad 3 в основном предполагает, что проблема в том, что iPad 3 достаточно быстр, чтобы запускать. Это не означает, что это было правильно на других платформах; только вам повезло на других платформах. Другие ответы, в частности, о несоответствии анимации начала/конца или анимации при выключенном экране, вероятно, по-прежнему применимы. –

+1

Я не могу сказать, насколько это уместно, поскольку у меня мало опыта работы с CoreAnimation, но Марко Армент обсудил специфическую проблему iPad 3 с CA renderInContext, которая вызвана фанкой графическим оборудованием. Обсуждение можно найти на его подкасте [Build and Analyze ep 72] (http://5by5.tv/buildanalyze/72), начиная с 56:20. Я считаю, что iPad медленнее. Может быть, что-то можно почерпнуть? – Swizzlr

+0

@RobNapier Да, ты оказался прав.Я трачу так много времени, чтобы убедиться, что мой текущий контроллер только анимировал экранные представления. Я никогда не думал, что другие контроллеры представлений могут делать свои собственные анимации. –

ответ

1

Хорошо, что было быстро. @RobNapier был прав в том, что это была проблема времени. Я прокомментировал мои анимации и ничего себе, там было много других просмотров, анимированных там! Несмотря на то, что я явно анимации только на экране, появился еще один ViewController, который получил события вращения за моими взглядами без моего ... м ... знания? Я имею в виду, я должен знать правильно? Я написал код. Сначала я не понимал, потому что мой набор взглядов охватывал весь экран. К сожалению, для этого потребуется много переписывания. Я использую Custom Container Controllers, и теперь я вижу, что мне нужно пересмотреть мою реализацию. Многие вещи становятся бесполезно повернутыми/анимированными. Но ничего себе ... что ответил на многочисленные вопросы производительности ....

Update

Так я думал, что проблема, которую я столкнулся должен был сделать с дополнительными видами анимируемого другими просматривать контроллеры. Однако, хотя это технически верно, это не так верно, как я думал или так, как я думал. Я абсолютно уверен, что никакие другие представления не были анимированы, удалив всю иерархию корневого представления из окна и заменив ее только контроллером представления, который я хочу повернуть. Это определенно помогло, но не полностью. Действительно, он просто «опустил планку», так что у меня было меньше шансов получить ошибку «wait_fences». Я все еще обнаружил, что получаю ошибку, хотя в определенных ситуациях.

Я считаю, что проблема, с которой я столкнулась, - это использование UIScrollView. Моя реализация имеет переменное количество подчиненных элементов, которыми она управляет. Конкретное представление - это моя собственная пользовательская реализация UIPickerView, так как вы можете себе представить, количество просмотров, которое он управляет, может стать довольно большим. Я обнаружил, что если эти subviews становятся слишком многочисленными, я начинаю получать ошибку wait_fences.

Похоже, что: Если UIScollView анимирован, он будет анимировать все его подвид, даже если эти подзаголовки не находятся на экране. Это важно. Я скорее подозреваю, что многие люди, которые борются с этой ошибкой, могут этого не осознавать. Каждое из этих внеэкранных подпунктов подталкивает вас к достижению ошибки wait_fences. Решение в моем случае «простое»: я собираюсь преобразовать UIScrollView в UITableView. Это будет означать переписывание большого количества кода, но, по крайней мере, я знаю, что внеэкранные просмотры будут удалены с экрана и, следовательно, не анимированы.

Я также отметил что-то еще: Core-Graphic Gradients сильно ударил вас. Я могу анимировать гораздо больше экранов, если они не используют градиенты. Конечно, мне нравятся градиенты, и я не хочу их бросать (вот почему я переписываю свой PickerView), но интересно и важно отметить.

Update 2

Закончено переписывания мой UIScrollView как Tableview и что, кажется, сделали свое дело. Когда я поворачиваю экран, у меня нет лаги и нет ошибки wait_fences.

Update 2

Так что да, это намного проще, чтобы поразить ошибку wait_fences на IPad 3, чем любой другой IPad/iPhone. Я прошел весь свой код, убедившись, что никогда не одушевляю все, что не на экране, так что проблема решена. Я все еще получаю ошибку wait_fences на iPad 3, когда я использую «тяжелые» процедуры рисования. Материал, который я обнаружил, заставляет меня ударить его:

  1. Градиенты: градиенты действительно делают работу ЦП на экране сетчатки.
  2. Прозрачность: если ваше представление не непрозрачно, процессор много работает, чтобы выяснить прозрачные области обзора.
  3. Прозрачный Цвета: не то же, что прозрачность зрения. Это наложение прозрачных цветов/градиентов поверх друг друга, чтобы получить «эффект», например, блеск, выделяет все.
  4. Текстуры: Я нахожу, что использование текстур делает его более вероятным, чтобы поразить ошибку wait_fences, но ничего похожего на то, что делают градиенты/прозрачность.
Смежные вопросы