Тайм-аут паузы активности после вызова GLSurfaceView.onPause () - PullRequest
2 голосов
/ 12 июня 2011

У меня есть игра, использующая OpenGL.Я построил из примеров, по большей части, основной поток, поток рендерера (GLSurfaceView.Renderer) и добавил также поток GameLogic.Когда игра запускается, кажется, что все проходит идеально.Когда нажата кнопка «Назад» и запущена функция onPause (), я также запускаю onPause из GLSurfaceView (), но в этот момент у меня происходит «сбой».Вот onPause MainActivity:

@Override
protected void onPause() {
    Log.d("Main", "Pre- Super onPause");
    super.onPause();
    Log.d("Main", "Post- Super onPause");
    mGSGLView.onPause();
    Log.d("Main", "Post- GL onPause");
}

Достигнута каждая точка журнала, кроме последней.В logcat, сразу после строки «Post Super onPause», я получаю тайм-аут паузы Activity.

Я не переопределяю onPause в классе GLSurfaceView ... и, насколько я знаю, это работало для меняв течение некоторого времени, но недавно это начало происходить, когда я начал получать полностью черный экран во второй раз, когда я пытался запустить свою игру, которая пока не получила ANR.95% моей игры работает изначально.Как и в примере с Сан-Анджелесом, Renderer вызывает onDraw, например, вместо java вызывает функцию NativeDraw.То же самое верно для onSurfaceCreated, onSurfaceChanged, и я также вызываю собственный метод GameLogic в логическом потоке (в основном все, что вызывается, это спящий поток и этот логический метод.)

Я надеюсь, что яучитывая достаточную информацию, пожалуйста, дайте мне знать, если есть что-то еще, что я должен предоставить.

РЕДАКТИРОВАТЬ - Ну ... Я фактически сузил проблему до вызова нативной функции, где я освобождаю определенные указателиранее для них была выделена память с помощью malloc ().Мой код там выглядит нормально, но если я опускаю вызов, все работает хорошо, поэтому мои вызовы free () должны что-то портить ...

1 Ответ

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

Хорошо, я отвечаю только на это сам, потому что решение было настолько специфичным для моего собственного кода, что никто бы не смог.

Если у вас есть память, выделенная на нативной стороне, будьте осторожны.освободить его до тех пор, пока вы не будете уверены, что никакой другой код не будет пытаться получить к нему доступ.

...