Я работаю над приложением для iPhone, которое представляет собой гибрид OpenGL ES и обычный пользовательский интерфейс iPhone. Это означает, что EAGLView
приветствует пользователя, затем некоторые обычные UIView
s, которые надвигаются на него (есть UINavigationController
в качестве корневого контроллера).
У меня случайный (но очень частый) сбой при переходе назад из подпредставления. Вот трассировка стека (... censored ...) из сборки 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
Вот список вещей, которые я знаю:
- Мое приложение не получает предупреждение о памяти.
- Мое приложение не обнаружило утечек в разделе "Инструменты".
- Нет сбоя на симуляторе, но иногда очень заметное отставание.
- В инструментах / OpenGL / ResourceBytes имеется значительное количество выпущенных данных непосредственно перед сбоем.
- Я использую как VBO, так и массивы vertex / texcoord / normals.
Так что я знаю, что это должны быть какие-то данные, которые выпускаются или уничтожаются, но я не знаю, как найти какие. Любые советы и рекомендации будут оценены; -)
ОБНОВЛЕНИЕ:
После установки некоторых точек останова, перемещения по стеку и поиска переменных, я нашел причину сбоя, но источник пока не найден.
В EAGLView, в методе presentFramebuffer
, где и когда происходит сбой, ivar colorRenderBuffer равен 0, если я могу поверить gdb, хотя попытка установить точку останова, когда она равна 0, не работает.
Кажется, что deleteFrameBuffer
вызов от layoutSubviews
не соответствует createFramebuffer
.
ОБНОВЛЕНИЕ 2:
Много точек останова позже ... Я обнаружил неправильную ситуацию: [EAGLView layoutSubviews]
вызывают в середине drawFrame
! Таким образом, буферы удаляются во время использования ... BAM!
Теперь, как мне исправить , что ?