Случайный сбой в приложении iPhone OpenGL при навигации

Я работаю над приложением для iPhone, которое представляет собой гибрид OpenGL ES и обычный пользовательский интерфейс iPhone. Это означает, что есть - это EAGLView , приветствующий пользователя, затем несколько обычных UIView , которые передаются поверх него (в качестве корневого контроллера есть UINavigationController ).

I ' у меня случайный (но очень частый) сбой при возвращении из подпредставления. Вот (... цензурированная ...) трассировка стека из сборки Release, но она точно так же вылетает в Debug.

#0  0x006863d0 in GetFBOBuffers ()
#1  0x00660120 in TerminateScene ()
#2  0x00660314 in FlushScene ()
#3  0x00660cd4 in FlushHW ()
#4  0x0066a6a0 in GLESPresentView ()
#5  0x323533a4 in -[EAGLContext presentRenderbuffer:] ()
#6  0x000026c0 in -[EAGLView presentFramebuffer] (self=0x11ce60, _cmd=<value temporarily unavailable, due to optimizations>) at (...)/Classes/EAGLView.m:157
#7  0x00004fdc in -[(...)ViewController drawFrame] (self=<value temporarily unavailable, due to optimizations>, _cmd=<value temporarily unavailable, due to optimizations>) at (...)    ViewController.m:380
#8  0x336ebd9a in __NSFireTimer ()
#9  0x323f54c2 in CFRunLoopRunSpecific ()
#10 0x323f4c1e in CFRunLoopRunInMode ()
#11 0x335051c8 in GSEventRunModal ()
#12 0x324a6c30 in -[UIApplication _run] ()
#13 0x324a5230 in UIApplicationMain ()
#14 0x0000214c in main (argc=1, argv=0x2ffff568) at (...)/main.m:14

Вот список вещей, которые я знаю:

  • Мое приложение не получает предупреждение о памяти.
  • В моем приложении не обнаружена утечка в разделе «Инструменты».
  • На симуляторе нет сбоев, но иногда наблюдается очень заметное отставание.
  • Незадолго до этого в Instruments / OpenGL / ResourceBytes имеется значительный объем выпущенных данных.
  • Я использую и VBO, и массивы vertex / texcoord / normals.

Я знаю, что это должны быть какие-то данные, которые будут выпущены или уничтожены, но я не знаю, как их найти. Приветствуются любые советы и хитрости; -)

ОБНОВЛЕНИЕ:

После установки некоторых точек останова, перемещения по стеку, поиска различных переменных, я ' Мы нашли причину сбоя, но еще не нашли источник.

В EAGLView, в методе presentFramebuffer , где и когда происходит сбой, ivar colorRenderBuffer равен 0, если я могу верить gdb, хотя попытка точки останова, когда она равна 0, похоже, не работает.

Похоже, что вызов deleteFrameBuffer из layoutSubviews не соответствует createFramebuffer .

ОБНОВЛЕНИЕ 2:

Много точек останова позже ... Я обнаружил неправильную ситуацию: [EAGLView layoutSubviews] вызывается в середине drawFrame ! Таким образом, буферы удаляются во время использования ... БАМ!

Как мне исправить , что ?

10
задан jv42 9 December 2011 в 09:08
поделиться