Подтвердить что ты не робот

Gpus_ReturnGuiltyForHardwareRestart Crash в [EAGLContext presentRenderbuffer]

Я получаю много аварий в EAGLContext presentRenderbuffer на iOS 11, но только на iPhone 6/6 + и старше.

По этот пост, я думаю, что мы уже исключили проблемы, связанные с VBO, переписывая все, чтобы не использовать VBO/VAO, но авария не была зафиксирована этим.

Есть еще несколько вопросов по поводу этого, но нет решения - кто-нибудь еще видел всплеск в этом сбое и смог его решить?


TL; ДР:

Вот что мы знаем до сих пор:

  • Авария относится к iOS11, iPhone 5S/6/6+. Это не происходит на 6S и выше.
  • Ядро стека OpenGL возвращает gpus_ReturnGuiltyForHardwareRestart
  • Это происходит, когда мы пытаемся вызвать [EAGLContext presentRenderbuffer] из CAEAGLLayer
  • У нас нет репрограммы.

Что мы пробовали до сих пор:

  • Удалите любую ссылку на VBO/VAO в нашем стеке рендеринга. Не помогло.
  • Мы попробовали репродукцию с большим спектром сценариев рисования (вращение, изменение размера, фон/передний план). Не повезло.
  • Насколько мы можем судить, в нашей логике приложений нет ничего конкретного в отношении семейства iPhone 6 и семейства iPhone 6S.

Некоторые подсказки (которые могут быть релевантными, но не обязательно):

  • Мы знаем, что когда текущийRenderBuffer вызывается из основного потока, и некоторое CATransaction происходит одновременно в основном потоке, скорость сбоя увеличивается.
  • Когда presentRenderBuffer вызывается в основном потоке (вместе со всем контуром чертежа), скорость сбоя идет немного вниз, но не сильно.
  • Существенный кусок (~ 20%) сбоев возникает, когда слой выходит из экрана и/или выходит из иерархии представления.

Вот трассировка стека:

  libGPUSupportMercury.dylib gpus_ReturnGuiltyForHardwareRestart

1 AGXGLDriver gldUpdateDispatch
2 libGPUSupportMercury.dylib gpusSubmitDataBuffers
3 AGXGLDriver gldUpdateDispatch
4 GLEngine gliPresentViewES_Exec
5 OpenGLES -[EAGLContext presentRenderbuffer:]
4b9b3361

Ответ 1

Из моего опыта я получаю такие сбои в следующих случаях:

  • Вызов API OpenGL, когда приложение находится в состоянии UIApplicationStateBackground.
  • Использование объектов (текстур, VBO и т.д.), которые были созданы в контексте OpenGL, которые имеют разные shareGroup. Это может произойти, если вы не вызываете [EAGLContext setCurrentContext:..] перед рендерингом или другой работой с объектом OpenGL.
  • Недопустимая геометрия. Например, это может произойти, если вы выделите индексный буфер для большего размера, который вам нужен. Заполните его некоторыми значениями, а затем попробуйте сделать с размером, который использовался при распределении. Иногда это работает (хвост буфера заполнен 0, и вы не видите никаких видимых сбоев). Иногда он сбой (когда хвост буфера заполнен барахлом и ссылка на точку, которая выходит за пределы).

Надеюсь, это поможет в некотором роде.

P.S. Может быть, вы расскажете дополнительную информацию о своем приложении? Я пишу приложение, которое отображает векторные карты в iOS и не сталкивается с какими-либо проблемами с iOS 11 в данный момент. Проводка рендеринга довольно проста CADisplayLink вызвать наш обратный вызов в основном потоке, когда мы можем сделать следующий кадр. Каждое представление с сценой OpenGL может иметь несколько фоновых контекстов для загрузки ресурсов в фоновом режиме (из них он имеет одну и ту же shareGroup с основным контекстом).