Лучшая процедура для обработки предупреждений памяти после потери контекста opengl - PullRequest
0 голосов
/ 30 декабря 2011

Я гоняюсь за ошибкой в ​​своей игре, думаю, наконец-то нашел проблему.

У меня есть подпрограмма управления памятью, которая вызывается при предупреждении памяти, она в основном проверяет, что загружено и не нужнои выпускает это.Большая часть моей памяти используется в текстурах для opengl, так что помимо текстур мне нужно всего лишь сбросить несколько объектов, чтобы система была довольна даже на 3G с ограниченным объемом памяти.

Теперь моя проблема св некоторых случаях я теряю контекст openGL, например, при воспроизведении фильма с помощью MPMoviePlayerController или при вызове системных представлений GC.

Несколько раз загрузка GC или MPMovie будет совпадать с вызываемой процедурой управления памятьюэто то, что я думаю, это сбой игры, так как у меня нет контекста opengl, я получаю:

malloc: *** error for object 0x471c9080: pointer being freed was not allocated

при попытке glDeleteTextures.

Теперь я меняю свойкод, поэтому я не пытаюсь удалить текстуры в недопустимом контексте (все еще проверяя, как это сделать), но у меня все еще остается проблема с тем, что делать, когда я получаю предупреждение о памяти во время отключения контекста opengl.

Я вижу только одну опцию

  1. Перед вызовом чего-то, что заставит меня потерять контекст, попробуйте освободить память

Мне не особенно нравится эта опция, потому что она вводит задержку в некоторых операциях.

  1. Кто-нибудь видит лучший способ?
  2. Правильно ли проанализирован мой анализ проблемы?(Действительно ли я теряю контекст opengl при использовании MPlayer и GC)
  3. Любой другой способ освободить текстуры?

Thx

1 Ответ

2 голосов
/ 30 декабря 2011

Ну, это, конечно, звучит так, как минимум, есть пара основных профилактических шагов, которые вы можете предпринять здесь:

  1. Вы должны держать ссылку на свой EAGLContext.Это позволит вам сделать ваш контекст текущим для работы (удаления) его текстур в любое время, когда это необходимо.(Вы не должны звонить glDeleteTextures в случайное время, если не уверены, что ваш контекст актуален.)
  2. Вы можете проверить, актуален ли ваш контекст с: if (myContext == [EAGLContext currentContext])....Вы можете выбрать не выполнять очистку памяти, если это не так, или выполнять другие действия в зависимости от ее состояния.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...