Быстрые динамические вершины в OpenGL ES 2.0 на Android

Я пытаюсь отрисовать набор линий на Android с помощью OpenGL ES 2.0, и мне нужно знать, как это сделать лучше всего.

Прямо сейчас я создал класс LineEngine, который создает FloatBuffer из всех вершин для рисования, а затем рисует все линии одновременно. Проблема в том, что, по-видимому, FloatBuffer.put() очень медленный и поглощает процессорное время как сумасшедший.

Вот мой класс

public class LineEngine {
    private static final float[] IDENTIY = new float[16];
    private FloatBuffer mLinePoints;
    private FloatBuffer mLineColors;
    private int mCount;

    public LineEngine(int maxLines) {
        Matrix.setIdentityM(IDENTIY, 0);

        ByteBuffer byteBuf = ByteBuffer.allocateDirect(maxLines * 2 * 4 * 4);
        byteBuf.order(ByteOrder.nativeOrder());
        mLinePoints = byteBuf.asFloatBuffer();

        byteBuf = ByteBuffer.allocateDirect(maxLines * 2 * 4 * 4);
        byteBuf.order(ByteOrder.nativeOrder());
        mLineColors = byteBuf.asFloatBuffer();

        reset();
    }

    public void addLine(float[] position, float[] color){
        mLinePoints.put(position, 0, 8); //These lines
        mLineColors.put(color, 0, 4); // are taking
        mLineColors.put(color, 0, 4); // the longest!
        mCount++;
    }

    public void reset(){
        mLinePoints.position(0);
        mLineColors.position(0);
        mCount = 0;
    }

    public void draw(){
        mLinePoints.position(0);
        mLineColors.position(0);
        GraphicsEngine.setMMatrix(IDENTIY);
        GraphicsEngine.setColors(mLineColors);
        GraphicsEngine.setVertices4d(mLinePoints);
        GraphicsEngine.disableTexture();
        GLES20.glDrawArrays(GLES20.GL_LINES, 0, mCount * 2);
        GraphicsEngine.disableColors();
        reset();
    }
}

Есть ли лучший способ объединить все эти строки вместе?

9
задан Nicol Bolas 28 May 2012 в 17:25
поделиться