Android-игра OpenGL ES не освобождает память, когда она находится вне активности GameSurface - PullRequest
1 голос
/ 24 июня 2011

У меня есть обычная основная активность, которая вызывает поверхность игровой активности (в Open GL), которая загружает все текстуры, поэтому играйте в игру.

Если я отбрасываю активность с поверхностью OpenGl, движок удаляет текстуры и закрывает игру активности. Кажется хорошо, но ...

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

А что будет, если я закрою все приложение? Android освободился, и я мог снова открыть приложение с нормальной скоростью и потреблять память.

Я пробовал мусор ... кажется, что-то связано с поверхностью opengl.

Мой вопрос: закрытие поверхностной активности, содержащей Open gl, буфер open gl все еще размещен в куче? После закрытия открыть новое действие с открытым гл будет дублировать размер открытого гл? По памяти кажется, что это происходит, но я мог бы выяснить причину.

Ответы [ 2 ]

0 голосов
/ 26 июня 2011

попытайтесь удалить всю текстуру в методе onDestroy (). таким образом, вся текстура будет уничтожена при выходе / завершении действия.

   @Override
protected void onDestroy() {
    super.onDestroy();
    for(Texture t:textures) {
        t.dispose();
    }
}

примечание: я действительно не знаю, что у Android есть собственный класс текстур. Я использовал libgdx и есть метод dispose для вызова. Может быть, вы должны найти способ избавиться от всего этого мусора. Если я напомню, что в классе Bitmap есть метод recycle (), который делает нечто похожее.

0 голосов
/ 25 июня 2011

Я получил решение.

Поскольку слабая ссылка, Android охраняет весь контекст в памяти.

Моя игра имеет паузу в игре mainThread и показывает сообщение Toast.Пользователь может покинуть или повторно войти в игру.Если он покинул экран, Android сохранит ссылку о мертвой активности в памяти, вероятно, также со всей открытой поверхностью gl, только потому, что сообщение Toast с ссылкой о мертвой активности все еще появляется после закрытия последней активности.Я просто использую getApplicationContext ().

...