Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
contedevel
57 / 55 / 13
Регистрация: 07.10.2012
Сообщений: 606
1

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

05.02.2015, 01:27. Просмотров 560. Ответов 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.02.2015, 01:27
Ответы с готовыми решениями:

Очень сильно проседает ФПС
Доброго времени суток. У маня возникла серьёзная проблема с компьютером , а...

Проседает фпс, нестабильный фпс в csgo и других играх
Процессор: i3 6100 3.7 GHz Видеокарта: nvidia 1050 Материнская плата: H110M...

Проседает фпс
Здравствуйте, собрал компьютер год назад, память и процессор только...

Проседает фпс
Железо: Мат плата MSI 970A-G43 Процессор AMD FX (tm) 4200 Quad core Processor...

Проседает фпс
Пишу игру. На сцене около 20 юнитов + пули, еще примерно 20, фпс начмнает...

2
petruchodd
129 / 126 / 22
Регистрация: 23.06.2009
Сообщений: 695
Завершенные тесты: 1
21.02.2015, 17:59 2
а в EasySprite что? покажи


Не по теме:

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

0
contedevel
57 / 55 / 13
Регистрация: 07.10.2012
Сообщений: 606
21.02.2015, 18:23  [ТС] 3
Цитата Сообщение от petruchodd Посмотреть сообщение
а в EasySprite что? покажи
Просто координаты центра, угол поворота, ширина/высота и масштабные коэффициенты... Внутри класса EasySprite ничего не использует OpenGL, это просто класс, хранящий позицию объекта в пространстве и адрес файла с текстурой, которая пока не используется
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.02.2015, 18:23

От чего же проседает ФПС?
Всем привет и у меня вот такой вопрос... сразу предупреждаю, что он приоритетно...

Местами проседает ФПС
Видеокарта PALIT GTX 550TI Конкретно проблему заметил в игре CS:GO,...

Проседает фпс в играх
В тяжелых играх по типу Fallout 4 или Ведьмак 3 время от времени в определенных...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

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