Метод отображения GLKView, вызывающий сбой в [GLKView _createFramebuffer]

Начиная с iOS 11, я замечал сбои OpenGL-ES, когда мы вызывали метод отображения в GLKView. Мы убедились, что GLKView и EAGLContext правильно созданы и вызваны из соответствующего потока.

Ниже приведена трассировка стека, связанная с падением.

Exception Type:  SIGABRT
Exception Codes: #0 at 0x182c042e8
Crashed Thread:  0

Thread 0 Crashed:
0   libsystem_kernel.dylib               0x0000000182c042e8 __pthread_kill + 8
1   libsystem_pthread.dylib              0x0000000182d1d748     pthread_kill$VARIANT$armv81 + 356
2   libsystem_c.dylib                    0x0000000182b72fbc abort + 136
3   Metal                                0x0000000184e15a9c MTLReleaseAssertionFailure + 268
4   AppleMetalGLRenderer                 0x00000001a269af18 GLDTextureRec::allocMetalTexture() + 724
5   AppleMetalGLRenderer                 0x00000001a269b010 GLDTextureRec::loadPrivateTexture(unsigned int, unsigned short*) + 52
6   AppleMetalGLRenderer                 0x00000001a269917c GLDTextureRec::update(unsigned int, unsigned short*) + 164
7   AppleMetalGLRenderer                 0x00000001a2695e98 GLDFramebufferRec::load() + 124
8   AppleMetalGLRenderer                 0x00000001a2696224 gldLoadFramebuffer + 12
9   GLEngine                             0x00000001a345e84c gleCheckFramebufferStatus + 112
10  GLEngine                             0x00000001a340bb44 glCheckFramebufferStatusEXT_Exec + 120
11  GLKit                                0x000000018feef330 -[GLKView _createFramebuffer] + 1144
12  GLKit                                0x000000018feef660 -[GLKView _setFramebuffer:] + 128
13  GLKit                                0x000000018feef8ac -[GLKView    _display:] + 84

Это вывод консоли Xcode, который я получил, когда смог воспроизвести этот сбой.

GTML desc[0] t=4 f=70 w=1001 h=944 d=1 m=1 s=4 a=1 r=1 u=4
failed assertion metalTexture != nil at line 863 in allocMetalTexture

Следуя трассировке стека, похоже, что происходит сбой, когда GLKit создает объект буфера кадра для GLKView, прежде чем он вызывает нас обратно в методе draw. Я не совсем то, что может быть потенциальной основной причиной проблемы.

К сожалению, этот сбой очень трудно воспроизвести и не происходит последовательно.

Некоторые важные фрагменты кода из кода.

Настройте GLKView и EAGLContext:

self.eaglContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2 sharegroup:self.resources.shareGroup];

// Create the actual OpenGL view
self.glView = [[GLKView alloc] initWithFrame:self.frame context:self.eaglContext];
self.glView.delegate = self;
self.glView.enableSetNeedsDisplay = NO;
self.glView.contentScaleFactor = self.screenDensity;
self.glView.drawableMultisample = GLKViewDrawableMultisample4X;

[EAGLContext setCurrentContext:self.eaglContext];
//Load custom textures
[EAGLContext setCurrentContext:nil];

//Now, I created vertexArrayObjects using glGenVertexArrays, enable blending etc, setup vertexBufferObjects for vertices and indices using glGenBuffers method.

Теперь, когда я готов рисовать контент, я вызываю приведенный ниже код. У меня также были проверки, чтобы убедиться, что eaglContext, GLKView, а также тот же поток используется там, где создается EAGLContext.

[EAGLContext setCurrentContext:self.eaglContext];
if(!CGRectIsEmpty(self.glView.bounds) && !self.hidden) {
    [self.glView display];
}
[EAGLContext setCurrentContext:nil];

Насколько мне известно, нам не нужно вызывать bindDrawable, так как я использую предоставленный GLKView сам буфер кадра по умолчанию.

Любое понимание / помощь действительно ценится.

0 ответов

Этот сбой происходит из-за того, что я пытался выполнить операцию рисования opengl, когда приложение находится в фоновом режиме или перемещается в фоновый режим.

С уважением.

Я предполагаю, что это, вероятно, собирается из памяти (в основном VRAM).

Apple, похоже, использует металлическую текстуру, представляющую OpenGL FBO, поэтому любая операция OpenGL FBO перейдет в операцию metalTexture.

Но если у вас недостаточно памяти, металлическая текстура, созданная из данных FBO, будет распределена неудачно.

Вероятно, для вас важна хорошая память с использованием монитора.

Другие вопросы по тегам