Статьи

Разработка игр для Android – переход с Canvas на OpenGL ES

Пора нам углубиться в графические возможности платформы Android. Android поддерживает OpenGL ES API. Само собой разумеется, что выгрузка графической обработки на выделенный графический процессор намного более оптимальна, чем в CPU. Большинство Android-устройств имеют такой выделенный графический процессор.

OpenGL — это API для написания 2D и 3D графики, которая отображается на GPU. Это высвободит драгоценные вычислительные ресурсы на процессоре, которые будут использоваться для более сложной физики или большего количества объектов или чего-либо, не связанного с графикой.

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

Если вы следили за статьями, относящимися к отображению графики на устройстве Android, вы уже знаете, что для отображения графических элементов нам нужны поверхность и средство визуализации. Мы использовали базовый SurfaceView, из которого получили Canvas, и нарисовали на нем все, вызвав поддерживаемый метод draw из нашего игрового цикла.

Использование OpenGL мало чем отличается. Android поставляется с специальной реализацией интерфейса SurfaceView для отображения изображений, отображаемых OpenGL.

Давайте создадим проект Android обычным способом.

Мастер новых проектов
Мастер новых проектов

Я называю деятельность просто Run . Проверьте, что сгенерировал мастер, и он должен выглядеть так:

1
2
3
4
5
6
7
8
public class Run extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

Ничего особенного.

Создание рендерера OpenGL

Давайте построим рендерер. Создайте класс GlRenderer, который реализует интерфейс android.opengl.GLSurfaceView.Renderer .

Это будет выглядеть так:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
 
import android.opengl.GLSurfaceView.Renderer;
 
public class GlRenderer implements Renderer {
 
    @Override
    public void onDrawFrame(GL10 gl) {
    }
 
    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
    }
 
    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    }
}

Нам необходимо реализовать вышеупомянутые 3 метода. В настоящее время они пусты и ничего не делают.

Методы

onSurfaceCreated (GL10 gl, EGLConfig config) создан или создан заново . Важно иметь в виду воссозданный бит, поскольку это означает, что каждый раз, когда устройство, например, засыпает и просыпается, поверхность воссоздается. Поскольку контекст, содержащий ресурсы, также разрушается, это место, где мы будем загружать наши ресурсы (изображения для текстур и т. Д.).

onSurfaceChanged (GL10 gl, int width, int height) вызывается всякий раз, когда изменяется размер поверхности. Это в основном влияет на нашу область просмотра. Окно просмотра — это просто прямоугольная область, через которую мы видим наш игровой мир.

onDrawFrame (GL10 gl) вызывается потоком рендеринга для рисования каждого кадра. Это где все рисование происходит. Нам не нужно называть это явно. Поток рендеринга создан для нас Android, и это будет называться.

Давайте переключимся на рендерер OpenGL. Проверьте новую активность Run .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package net.obviam.opengl;
 
import android.app.Activity;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
 
public class Run extends Activity {
 
    /** The OpenGL view */
    private GLSurfaceView glSurfaceView;
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        // requesting to turn the title OFF
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        // making it full screen
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
 
        // Initiate the Open GL view and
        // create an instance with this activity
        glSurfaceView = new GLSurfaceView(this);
 
        // set our renderer to be the main renderer with
        // the current activity context
        glSurfaceView.setRenderer(new GlRenderer());
        setContentView(glSurfaceView);
    }
 
    /** Remember to resume the glSurface  */
    @Override
    protected void onResume() {
        super.onResume();
        glSurfaceView.onResume();
    }
 
    /** Also pause the glSurface  */
    @Override
    protected void onPause() {
        super.onPause();
        glSurfaceView.onPause();
    }
}

В строке 12 мы объявляем переменную-член GLSurfaceView . Это наш вид OpenGL, предоставленный Android. Когда мы создаем его экземпляр (строка 27 ), мы должны сделать его осведомленным о контексте. То есть для представления иметь доступ к среде приложения.

Все, что нам нужно сделать, это добавить наш рендерер в это представление. Это мы делаем в строке 31 .

В строке 32 указывается действие для использования нашего представления OpenGL.

Методы onResume () и onPause () переопределяются и запускают соответствующие методы в нашем представлении.

Вы можете запустить приложение как приложение для Android, и вы должны увидеть пустой черный экран.

Вот и все. Мы перешли с холста на рендерер OpenGL.

Загрузите исходный код и проект затмения здесь (obviam.opengl.p01.tgz)

Справка: OpenGL ES с учебником по Android — переход с Canvas на OpenGL от нашего партнера по JCG Тамаса Яно из блога « Против зерна ».

Не забудьте проверить нашу новую Android игру ArkDroid (скриншоты ниже) . Ваш отзыв будет более чем полезным!
Статьи по Теме: