Я избежал этой проблемы, а не решил ее для своей игры:
Я использую «FrameLayout» в качестве основного макета, с «GLSurfaceView» в качестве первого макета внутри (т. Е. В нижней части стека), следующей группой представления «menu» и непрозрачной верхней части экрана «loading» из этого (установите на match_parent
, чтобы заполнить экран):
<FrameLayout
android:id="@+id/graphics_frameLayout1"
android:layout_width="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="fill_parent">
<android.opengl.GLSurfaceView
android:id="@+id/graphics_glsurfaceview1"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
</android.opengl.GLSurfaceView>
<LinearLayout
android:id="@+id/menu_linearLayout1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:visiblility="gone"
android:background="#000000">// opaque background
// menus etc be here
</LinearLayout>
<LinearLayout
android:layout_height="fill_parent"
android:id="@+id/loading_linearLayout1"
android:layout_width="fill_parent"
android:orientation="vertical"
android:background="#000000">// opaque background
<ProgressBar
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/loading_progressBar1">
</ProgressBar>
<TextView
android:layout_width="wrap_content"
android:id="@+id/loading_textView1"
android:layout_height="wrap_content"
android:text="Loading...">
</TextView>
</LinearLayout>
</FrameLayout>
Когда загрузка закончилась, я установил загрузочную группу просмотра как невидимую или пропавшую, а меню просмотра - в видимую. После того, как пользователь выбрал опцию запуска игры, я запускаю игровую логическую цепочку и снова открываю меню
У меня есть иерархия действий (ReTouchMenuActivity extends ReTouchActivity
, затем в новом файле ReTouchActivity extends RokonActivity
), так что я не получаю всю игру в одном неуправляемом файле
Я загружаю другие ресурсы в отдельные потоки (например, данные вершин для 3D-моделей), а затем загружаю их в вершины, координаты текстуры и т. Д. Непосредственно перед рисованием массивов (т.е. gl.glVertexPointer(3, GL10.GL_FLOAT, 0, meshVertices);
Настоящая проблема заключается в том, что вам необходимо загрузить текстуры в потоке GL, который может блокировать поток пользовательского интерфейса (хотя и не прерывая его), что приводит к отсутствию реакции на ввод данных пользователем при загрузке больших текстур. Моя собственная игра с использованием вышеупомянутого на ZTE Blade под управлением Android 2.1 может занять до двух секунд, чтобы загрузить некоторые большие текстуры (1 Мб +), и даже круговой индикатор выполнения перестает вращаться в течение этого времени.
Я заметил, что вы finish()
активность, когда пользователь нажимает кнопку выхода, но когда пользователь покидает приложение, не нажимая кнопку выхода (например, когда он получает входящий звонок или выбирает что-то на панели уведомлений), действие / приложение по-прежнему работает в фоновом режиме. Вы должны повторно загрузить текстуры, когда они возвращают активность / приложение обратно на вершину стека (то есть пользователь открывает его заново). Если вы не перезагрузите текстуры в таком сценарии, пользователь просто получит загрузку пустых вместо текстур
Если вы попытаетесь сохранить в качестве переменной дескриптор / объект GL, который android передает в ваш метод Renderer
class 'onDraw
, например, для использования потоком загрузки текстуры, то он выходит из контекста после onDraw
метод возвращается и загрузка текстуры завершается неудачно.
Я полагаю, это потому, что android стирает все графические данные / состояние openGL, когда пользователь покидает приложение, если другие приложения захотят его использовать. Поэтому я предполагаю, что вы не можете делать именно то, что вы хотите (предварительно загрузить текстуры в Android OS или что-то еще). Хотя, если кто-то знает лучше, мне было бы интересно услышать.
Edit:
В этом вопросе есть несколько хороших ответов о том, как ускорить фактическое время загрузки текстур