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

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

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

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

05.02.2015, 01:27. Просмотров 498. Ответов 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. Сильно проседает ФПС
Посмотрите здесь:
Windows 7 Очень сильно проседает ФПС
Проседает фпс
Проседает фпс
Проседает фпс ActionScript
Проседает фпс в играх
Проседает фпс в играх
Местами проседает ФПС
Жёстко проседает фпс
Проседает фпс в играх на ноутбуке
Проседает фпс на новой видеокарте
Проседает фпс во всех играх Windows 10
Зависают игры на 0,5-0,8 секунд, проседает фпс

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
Сообщений: 596
21.02.2015, 18:23  [ТС]     OpenGL ES 2.0. Сильно проседает ФПС #3
Цитата Сообщение от petruchodd Посмотреть сообщение
а в EasySprite что? покажи
Просто координаты центра, угол поворота, ширина/высота и масштабные коэффициенты... Внутри класса EasySprite ничего не использует OpenGL, это просто класс, хранящий позицию объекта в пространстве и адрес файла с текстурой, которая пока не используется
Ответ Создать тему
Опции темы

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