Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 590
#1

OpenGL ES 2.0. Сильно проседает ФПС - Android

05.02.2015, 01:27. Просмотров 488. Ответов 2
Метки нет (Все метки)

Здравствуйте!
Имеется такой отрисовщик:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
package com.contedevel.lastlegend.core.render;
 
import android.content.Context;
import android.graphics.Bitmap;
import android.opengl.GLES20;
import android.opengl.GLSurfaceView;
import android.opengl.GLUtils;
import android.opengl.Matrix;
import android.util.Log;
 
import com.contedevel.lastlegend.core.objects.EasyCamera;
import com.contedevel.lastlegend.core.objects.EasySprite;
import com.contedevel.lastlegend.core.objects.textures.EasyAtlas;
import com.contedevel.lastlegend.core.objects.textures.EasyTexture;
import com.contedevel.lastlegend.core.utils.EasyColor;
import com.contedevel.lastlegend.core.utils.EasyFPS;
import com.contedevel.lastlegend.core.utils.EasyMatrix;
import com.contedevel.lastlegend.core.utils.EasyVector2;
 
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.nio.ShortBuffer;
 
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
 
public class EasyRenderer implements GLSurfaceView.Renderer {
    private static final String TAG = EasyRenderer.class.getSimpleName();
    private Context context;
    private EasyColor color;
    private EasyCamera camera;
    private EasySprite sprite;
 
    //Matrix
    private float[] mtrxProjection = new float[16];
    private float[] mtrxView = new float[16];
    private float[] mtrxViewWork = new float[16];
    private float[] mtrxResult = new float[16];
 
    //Shader program handles
    public static int sp_SolidColor;
 
    // Geometric variables
    public static final short INDICES[] = new short[] {0, 1, 2, 0, 2, 3};
 
    public static EasyCache.EasyCacheItem cacheItem;
    public ShortBuffer drawListBuffer;
 
    public EasyRenderer(Context context) {
        this.context = context;
        color = new EasyColor(EasyColor.COLOR_WHITE);
    }
 
    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        EasyAtlas atlas = new EasyAtlas("img/img.png");
        EasyTexture texture = new EasyTexture(atlas)
                .setColor(new EasyColor(0xb0ff00ff))
                .setMode(EasyTexture.MODE_COLOR);
        sprite = new EasySprite(1f, 1f, 200f, 200f, texture);
 
        setup();
        setupImage();
        GLES20.glClearColor(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha());
        GLES20.glEnable(GLES20.GL_BLEND);
        GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);
        initShaders();
    }
 
    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        camera = new EasyCamera(0f, 0f, width, height);
        camera.setZoom(0.5f);
        setupCamera(camera);
        GLES20.glUseProgram(sp_SolidColor);
        EasyMatrix.copy(mtrxView, mtrxViewWork);
        EasyMatrix.translateXY(mtrxViewWork, 1, 1);
        EasyMatrix.rotateXY(mtrxViewWork, sprite.getAngle());
        Matrix.multiplyMM(mtrxResult, 0, mtrxProjection, 0, mtrxViewWork, 0);
    }
 
    @Override
    public void onDrawFrame(GL10 gl) {
        for(int i = 0; i < 50; ++i) {
            GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
            int positionHandler = -1;
            int textureCoordinatesHandler = -1;
            EasyTexture texture = sprite.getTexture();
 
            positionHandler = GLES20.glGetAttribLocation(sp_SolidColor, "vPosition");
            GLES20.glEnableVertexAttribArray(positionHandler);
            GLES20.glVertexAttribPointer(positionHandler, 3, GLES20.GL_FLOAT, false, 0, cacheItem.getVertexBuffer());
            int mtrxHandle = GLES20.glGetUniformLocation(sp_SolidColor, "uMVPMatrix");
            GLES20.glUniformMatrix4fv(mtrxHandle, 1, false, mtrxResult, 0);
            int colorHandle = GLES20.glGetUniformLocation(sp_SolidColor, "vColor");
            EasyColor color = texture.getColor();
            GLES20.glUniform4fv(colorHandle, 1, color.getColor(), 0);
 
            GLES20.glDrawElements(GLES20.GL_TRIANGLES, INDICES.length,
                    GLES20.GL_UNSIGNED_SHORT, drawListBuffer);
 
            if (positionHandler != -1)
                GLES20.glDisableVertexAttribArray(positionHandler);
        }
        EasyFPS.log();
    }
 
    public void setup() {
        cacheItem = EasyCache.buildCacheItem(sprite);
 
        ByteBuffer dlb = ByteBuffer.allocateDirect(INDICES.length * 2);
        dlb.order(ByteOrder.nativeOrder());
        drawListBuffer = dlb.asShortBuffer();
        drawListBuffer.put(INDICES);
        drawListBuffer.position(0);
 
    }
 
    public void setupImage() {
        EasyTexture texture = sprite.getTexture();
 
        // Generate Textures, if more needed, alter these numbers.
        int[] textureNames = new int[1];
        GLES20.glGenTextures(1, textureNames, 0);
        texture.getAtlas().setTextureId(textureNames[0]);
 
        // Temporary create a bitmap
        Bitmap bmp = EasyTextureHelper.getFromAssets(context,
                texture.getAtlas().getFileName());
 
        // Bind texture to texture name
        GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureNames[0]);
 
        // Set filtering
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER,
                GLES20.GL_LINEAR);
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER,
                GLES20.GL_LINEAR);
 
        // Load the bitmap into the bound texture.
        GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bmp, 0);
 
        // We are done using the bitmap so we should recycle it.
        bmp.recycle();
 
    }
 
    private void setupCamera(EasyCamera camera) {
        GLES20.glViewport(0, 0, (int)camera.getWidth(), (int)camera.getHeight());
        float scaleX = camera.getWidth()*camera.getScaleX()/2;
        float scaleY = camera.getHeight()*camera.getScaleY()/2;
        Matrix.orthoM(mtrxProjection, 0, -scaleX, scaleX, -scaleY, scaleY, 0, 50);
        EasyVector2 angle = camera.getVectorAngle();
        EasyMatrix.setLookAt(mtrxView,
                camera.getX(), camera.getY(),
                camera.getX(), camera.getY(),
                angle.x, angle.y);
    }
 
    private void initShaders() {
        sp_SolidColor = EasyShader.compileProgramGL20(
                EasyShader.getFromAssets(context, EasyShader.COLOR_VERTEX_SHADER),
                EasyShader.getFromAssets(context, EasyShader.COLOR_FRAGMENT_SHADER));
    }
}


ФПС выдает всего 10-13, на довольно производительных устройствах (Samsung Galaxy Win).
Из-за чего может быть такая задержка?
P.S. 50 итераций делаю просто, чтобы имитировать отрисовку 50 объектов. CacheItem возвращает готовый буффер (не строит его заново), EasyColor getColor тоже возвращает заранее созданный массив цвета.

Shader самый обычный:
Кликните здесь для просмотра всего текста
uniform mat4 uMVPMatrix;
attribute vec4 vPosition;
void main() {
gl_Position = uMVPMatrix * vPosition;
}


Кликните здесь для просмотра всего текста
precision mediump float;
uniform vec4 vColor;
void main() {
gl_FragColor = vColor;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.02.2015, 01:27     OpenGL ES 2.0. Сильно проседает ФПС
Посмотрите здесь:

Android OpenGL (Android)
Android OpenGL 1.1 Android
Android OpenGL ES 1.0 и плавное пермещение
OpenGL ES AndroidNDK Android
OpenGL ES Android
Android OpenGL
Android Простая игра. OpenGL
Android Инициализация OpenGL ES
Android Кривые в OpenGL SE 1.0
Android Текстура OpenGL es 2
OpenGl ES 2.0 Текстуры Android
Android Комбинирование 2D и 3D в OpenGL ES 2.0

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
petruchodd
90 / 90 / 8
Регистрация: 23.06.2009
Сообщений: 511
21.02.2015, 17:59     OpenGL ES 2.0. Сильно проседает ФПС #2
а в EasySprite что? покажи


Не по теме:

какой же дибильный код в opengl es 2.0

contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 590
21.02.2015, 18:23  [ТС]     OpenGL ES 2.0. Сильно проседает ФПС #3
Цитата Сообщение от petruchodd Посмотреть сообщение
а в EasySprite что? покажи
Просто координаты центра, угол поворота, ширина/высота и масштабные коэффициенты... Внутри класса EasySprite ничего не использует OpenGL, это просто класс, хранящий позицию объекта в пространстве и адрес файла с текстурой, которая пока не используется
Yandex
Объявления
21.02.2015, 18:23     OpenGL ES 2.0. Сильно проседает ФПС
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru