Предупреждение памяти iOS нарушает EAGLView

Когда я получаю предупреждение уровня 1 о памяти, мой EAGLView начинает выплевывать строки с ошибками openGL (502 и 506), и приложение не падает, но EAGLView перестает отвечать. ошибки рассылаются из-за того, что Cocos2d Director вызывает draw.

Так выглядит обратный вызов предупреждения памяти:

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
    [[CCDirector sharedDirector] purgeCachedData];
}
  1. Что означают ошибки 502 и 506 и 2. Должны ли быть какие-либо последствия для представления opengl из-за предупреждений памяти, или он выпускает что-то, чего не должно быть в моем коде?

[Обновление]

удалось получить подробные логи из cocos2d:

Received memory warning. Level=1
cocos2d: deallocing <CCSprite = 002657B0 | Rect = (0.00,0.00,32.00,32.00) | tag = -1 | atlasIndex = -1>
cocos2d: deallocing <CCTexture2D = 00265EA0 | Name = 4 | Dimensions = 32x32 | Coordinates = (1.00, 1.00)>
cocos2d: deallocing <CCSprite = 00265A70 | Rect = (0.00,0.00,32.00,32.00) | tag = -1 | atlasIndex = -1>
cocos2d: deallocing <CCSprite = 00266050 | Rect = (0.00,0.00,32.00,32.00) | tag = -1 | atlasIndex = -1>
cocos2d: deallocing <LineNode = 0027A630 | Tag = -1>
cocos2d: deallocing <LineNode = 0027AB90 | Tag = -1>
cocos2d: deallocing <LineNode = 0027AF50 | Tag = -1>
cocos2d: deallocing <LineNode = 0027B270 | Tag = -1>
cocos2d: deallocing <LineNode = 00204820 | Tag = -1>
cocos2d: deallocing <PaintingView = 00264970 | Tag = -1>
cocos2d: deallocing <TutorialView = 00266570 | Tag = -1>
cocos2d: deallocing <CCRenderTexture = 00266660 | Tag = -1>
cocos2d: deallocing <CCTexture2D = 00266750 | Name = 5 | Dimensions = 1024x1024 | Coordinates = (1.00, 0.75)>
cocos2d: deallocing <CCSprite = 00266960 | Rect = (0.00,0.00,1024.00,768.00) | tag = -1 | atlasIndex = -1>
cocos2d: deallocing <EAGLView: 0x24aee0; frame = (0 0; 1024 768); transform = [0, -1, 1, 0, 0, 0]; autoresize = RM+BM; layer = <CAEAGLLayer: 0x2492c0>>
cocos2d: deallocing <ES1Renderer = 0024D0E0 | size = 768x1024>
modifying layer that is being finalized - 0x2fab80

Так что это почти все. похоже, что все, кроме узла сцены, исчезает.


person Affian    schedule 11.07.2011    source источник


Ответы (1)


Что касается того, что означают ошибки OpenGL, вы можете обратиться к своим заголовкам OpenGL, которые сообщат вам, что 502 - это GL_INVALID_OPERATION, а 506 - это GL_INVALID_FRAMEBUFFER_OPERATION.

Я ничего не вижу из вашего вопроса или предоставленного кода, но я предполагаю, что либо вы преждевременно освобождаете свой фреймбуфер (чего, вероятно, не следует делать во время выполнения), либо Cocos2D освобождает ваш фреймбуфер, когда вы вызываете purgeCachedData ( последнее, в чем я как бы сомневаюсь) и не смог полностью воссоздать его (если вообще). Вы можете проверить свою реализацию EAGLView и посмотреть, настроена ли она для обработки воссоздания фреймбуфера, когда это необходимо (и посмотреть, есть ли где-нибудь, что вы освобождаете фреймбуфер без надобности).

Тем не менее, если вы получаете предупреждения о памяти, вы также можете указать их источник.

person Community    schedule 12.07.2011
comment
Я только что узнал, что cocos освобождает почти все, с чем я работаю, включая EAGLView. - person Affian; 12.07.2011
comment
Это довольно жесткая чистка. О_о - person ; 12.07.2011
comment
Есть ли какой-то особый способ выгрузить EAGLView, чтобы OpenGL больше его не использовал? - person Affian; 12.07.2011
comment
Ну зачем вы EAGLView разгружаете? Это маленький объект, который не имеет большого значения. Если ваше приложение работает в фоновом режиме, вы можете отключить фреймбуферы, но все остальное, что требуется для быстрого запуска, вероятно, должно оставаться до завершения приложения. В таком случае, почему Cocos2D все еще пытается рисовать, хотя этого не должно быть? Вы пренебрегаете завершением анимации / цикла / что у вас есть для рендеринга? - person ; 12.07.2011
comment
Что происходит, так это то, что контроллер представления, который содержит GLview, подталкивается и загружает представление и запускает директор, затем, когда он выгружается (возвращается в стек навигации), EAGLView выгружается и директор останавливается. когда я возвращаюсь к нему, иногда он запускает предупреждение о памяти, и вышеуказанное освобождается и вызывает ошибки в opengl. - person Affian; 12.07.2011
comment
Исходя из этого, я сомневаюсь, что смогу действительно сказать вам, что происходит, не заходя в отладчик, когда все освобождается, и просто иду по очереди, пытаясь выяснить, что идет не так. - person ; 12.07.2011