2014-01-07 2 views
0

У меня есть приложение, которое отлично работает на предыдущих итерациях iPad, но падает на новый iPad Air.GLKTextureInfo используется с саморазрушением на iPad Air?

Катастрофа происходит на этой линии с ошибкой EXE_BAD_ACCESS:

self.textureInfo = [GLKTextureLoader textureWithContentsOfData:imageData options:options error:&error];  
if (self.textureInfo == nil) { 
    NSLog(@"Error loading texture file %@", [error localizedDescription]); 
    return nil; 
} 

Я пытаюсь устранить эту проблему. Может ли кто-нибудь предположить, почему это может быть проблемой в эфире, в то время как точно такой же код работает на всех других устройствах? Этот код работает в потоке.

+1

Есть ли возможность одновременного доступа к контексту OpenGL ES, на котором это включено? Это звучит для меня как состояние гонки, которое теперь срабатывает из-за немного отличающихся характеристик производительности iPad Air. –

+0

Привет, Брэд, я думаю, это возможно. Как я могу предотвратить/устранить эту проблему? – GuybrushThreepwood

+0

Обычно я использую очередную диспетчерскую очередь для каждого контекста и отправляю ему все, что касается этого контекста. Это гарантирует последовательный доступ, но позволяет избежать дорогостоящих блокировок. Это также довольно легко реализовать. –

ответ

1

Чтобы закрыть это, я вновь заявить, что я сделал в моем комментарии выше:

В общем, когда я столкнулся с нечетным OpenGL ES падает, как это, что внезапно появляются на одном классе устройства или другого, я всегда проверяйте одновременный доступ к одному и тому же контексту OpenGL ES. Если вы одновременно получаете доступ к определенному контексту OpenGL ES из нескольких потоков, будут происходить плохие вещи, в том числе такие сбои.

Мой предпочтительный способ обработки заключается в том, чтобы обернуть доступ к определенному контексту OpenGL ES в блоках в очереди последовательной отправки GCD. Это гарантирует безопасный доступ к контексту без накладных расходов на блокировки. Это также довольно легко реализовать в вашем коде.