2016-02-16 2 views
0

Похоже, что недавно мое приложение вылетает из-за того, что метод renderbufferStorage возвращает false. Я не знаю, что происходит, поэтому я добавил тесты раньше, но они никогда не поднимают исключения. Я в основном потоке, текущий контекст кажется, хорошо, в eaglLayer тоже, но в любом случае она падает на renderbufferStorage ..OpenGL ES 2.0 renderbufferStorage crash

EAGLContext* defaultEAGLContext = getDefaultContext(); 
EAGLContext* currentContext = [EAGLContext currentContext]; 

if(![NSThread isMainThread]) { 
    NSLog(@"ERROR : renderbufferStorage not called on main thread"); 
    @throw [NSException exceptionWithName:@"ERROR" 
            reason:@"renderbufferStorage not called on main thread" 
           userInfo:nil]; 
} 

if(!currentContext) { 
    @throw [NSException exceptionWithName:@"ERROR" 
            reason:@"Current context is null" 
           userInfo:nil]; 
} 

if(!defaultEAGLContext) { 
    @throw [NSException exceptionWithName:@"ERROR" 
            reason:@"Default context is null" 
           userInfo:nil]; 
} 

if(defaultEAGLContext != currentContext) { 
    @throw [NSException exceptionWithName:@"ERROR" 
            reason:@"Default context is different than current context" 
           userInfo:nil]; 
} 

if(!_eaglLayer) { 
    @throw [NSException exceptionWithName:@"ERROR" 
            reason:@"EAGL layer error" 
           userInfo:nil]; 
} 

if (![defaultEAGLContext renderbufferStorage:GL_RENDERBUFFER fromDrawable:_eaglLayer]) { 
    NSLog(@"ERROR : Failed to obtain renderbuffer storage from layer"); 
    @throw [NSException exceptionWithName:@"ERROR" 
            reason:@"Failed to obtain renderbuffer storage from layer" 
           userInfo:nil]; 
} 

вы знаете, почему этот метод будет возвращать ложные ли, даже случайно? Заранее спасибо

ответ

0

На самом деле мой метод инициализации назывались в два раз из-за некоторые потоки не синхронизированным. Поэтому «renderbufferStorage» вызывался 2 раза, а во второй раз он возвращал false, потому что хранилище уже было получено из слоя.

0

Вы должны написать, что говорит авария, но самая распространенная ошибка - забыть переопределить метод layerClass для целевого представления.

мнение которого слой используется в визуализации буферного хранилища должны иметь следующее переопределение:

+ (Class)layerClass { 
    return [CAEAGLLayer class]; 
} 
+0

Благодарим вас за ответ. У меня уже есть эта часть кода, хотя :(Ну, метод просто возвращает false, к сожалению, нет журнала. Он падает после того, если буфер визуализации не установлен, поэтому я делаю исключение раньше, чтобы отбросить его с помощью crashlytics. Плохая идея? EDIT: также он случайно падает, некоторые пользователи его получили, но я никогда не повторяю его :( – Xys

+0

Я вижу. Поэтому метод не сбой, а возвращает false ... Является ли ваш буфер визуализации привязанным в то время? –

+0

Да , после создания контекста (и установить его тока), я связываю буфер, как это: glGenRenderbuffers (1, & _colorRenderBuffer); glBindRenderbuffer (GL_RENDERBUFFER, _colorRenderBuffer); – Xys