Получение Metal Cra sh (код IOAF 5) во время переходаFromView: toView: duration: options: завершения: call - PullRequest
0 голосов
/ 12 июля 2020

Я получаю следующее в моем выводе Xcode во время простого перехода к просмотру в одном из моих UIViewController:

    2020-07-12 11:18:53.483381-0700 ClubHub[9505:2551251] Metal GPU Frame Capture Enabled
2020-07-12 11:18:53.486918-0700 ClubHub[9505:2551251] Metal API Validation Enabled
2020-07-12 11:19:05.562915-0700 ClubHub[9505:2551365] Execution of the command buffer was aborted due to an error during execution. Discarded (victim of GPU error/recovery) (IOAF code 5)
2020-07-12 11:19:05.563242-0700 ClubHub[9505:2551365] Execution of the command buffer was aborted due to an error during execution. Discarded (victim of GPU error/recovery) (IOAF code 5)
2020-07-12 11:19:05.563644-0700 ClubHub[9505:2551365] Execution of the command buffer was aborted due to an error during execution. Caused GPU Timeout Error (IOAF code 2)
2020-07-12 11:19:05.563824-0700 ClubHub[9505:2551365] Execution of the command buffer was aborted due to an error during execution. Caused GPU Timeout Error (IOAF code 2)

Кажется, это ново с iOS 12. Я видел, что это происходило на iPhone 7, а также iPhone X с iOS 12 и iOS 13, хотя я не думаю, что проблема связана с аппаратным обеспечением телефона c. Моя установка такова, что у меня есть общий c UIViewController, в который я помещаю два UIView, а затем переключаюсь между ними с помощью правой кнопки панели навигации. Как только ошибка возникает, кажется, что она больше не возникает, пока я не выйду из UIController, а затем вернусь к нему.

Переход выглядит следующим образом:

__weak __typeof(self)   weakSelf = self;

// Animate the flip between the map and list views
[UIView transitionFromView: (self.showingMapView) ? self.mapView : self.listView toView: (self.showingMapView) ? self.listView : self.mapView
                  duration: 0.75
                   options:(self.showingMapView) ? UIViewAnimationOptionTransitionFlipFromLeft | UIViewAnimationOptionShowHideTransitionViews : UIViewAnimationOptionTransitionFlipFromRight | UIViewAnimationOptionShowHideTransitionViews
                completion: ^(BOOL finished)
 {
    __strong __typeof(weakSelf)strongSelf = weakSelf;
    strongSelf.showingMapView = !strongSelf.showingMapView;
    [strongSelf.switchViews setTitle:(strongSelf.showingMapView) ? [StringResources getString: @"kList"] : [StringResources getString: @"kMap"] forState:UIControlStateNormal];
}];

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

Приветствуются любые мысли или варианты.

ОБНОВЛЕНИЕ

Я заменил каждый моих представлений с помощью простого UIView, одного красного цвета, а другого синего. Переход происходит без проблем. Затем я заменил красное представление представлением списка и по-прежнему не имел проблем с переключением между списком и синими представлениями. Наконец, я заменил красное представление на MapView, и проблема проявляется.

При дальнейшем исследовании выяснилось, что обновление карты (которое MKMapView выполняет асинхронно, когда оно не скрыто - обновление аннотаций и наложенных представлений) кажется, мешает переходу. Я проверил это, удалив флаг UIViewAnimationOptionShowHideTransitionViews, который удаляет и добавляет представление к родительскому элементу. Это устраняет проблему. Однако макет карты неверен, пока я не смогу наложить ограничения на представление в обработчике завершения перехода. Кто-нибудь каждый испытал это или знает, как решить?

...