Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

05.02.2015, 01:27. Просмотров 518. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос OpenGL ES 2.0. Сильно проседает ФПС (Программирование Android):

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

Проседает фпс - Компьютерное железо
Здравствуйте, собрал компьютер год назад, память и процессор только подержанные, остальное новое. В играх всё летает на максималках 150-300...

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

Проседает фпс - Видеокарты
Железо: Мат плата MSI 970A-G43 Процессор AMD FX (tm) 4200 Quad core Processor 4х ядерный по 3.3 Видюха Nvidia gt 640. Ребят, все...

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

Проседает фпс в играх - Видеокарты
Привет) моя проблема такова. Начинаю играть в любую игру играю 5 минут начинает провисать фпс до минимума (около 10 ) лагает минуты 3-5...

2
petruchodd
109 / 106 / 11
Регистрация: 23.06.2009
Сообщений: 583
21.02.2015, 17:59 #2
а в EasySprite что? покажи


Не по теме:

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

0
contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 598
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
Привет! Вот еще темы с ответами:

Проседает фпс в играх - Видеокарты
В общем дело в следующем. Сначала о железе Операционная система Microsoft Windows 7 Home Basic AMD FX-8120, 4100 MHz (20.5 x 200)...

Жёстко проседает фпс - Ноутбуки
Всем привет!Ищу человека,который бы мог сказать нормально это,или нет. Суть такова...При игре в кс го,как только захожу,в главном меня...

Проседает фпс в играх на ноутбуке - Ноутбуки
Вот моё железо Проседает при игре почти в любую игру,на офф онлайн не проверял,вот скрины когда в доте 60 фпс,потом же фпс падает...

Проседает фпс во всех играх - Windows 10
Всем привет. Не знаю даже откуда это взялось, думал, что вирусы - переустановил винду и никакого эффекта. Фпс проседает где-то после 2...


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

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

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