如何在Android OpenGL ES'OnDrawFrame'中绘制对象数组

时间:2013-10-02 02:02:16

标签: android arrays opengl-es

我将尝试在当前的'OnDrawFrame'中绘制一个对象数组。

@Override
public void onDrawFrame(GL10 gl) {
for(int i=0; i<objectArray.length; i++){
     objectArray[i].draw(gl);
     }
}

当我尝试使用上述'for'语句时,浪费内存似乎太可怕了。

即使你在实践中喜欢它也会被删除,最后会显示绘图对象。

通过做什么,所有或将被绘制的对象数组?

此外,我需要做些什么才能有效利用内存

我们感到困扰的是什么日夜的泄漏。


画一个线类.......

public class LINETEST {

float[] vertices = null;
private short[] indices = null;

public FloatBuffer verticesBuffer;
private ShortBuffer indexBuffer; 

public LINETEST() {

}

public void draw(GL10 gl) {

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, verticesBuffer);
    gl.glLineWidth(2);
    gl.glColor4f(0f, 0f, 0f, 0f);

    gl.glDrawElements(GL10.GL_LINE_STRIP, indices.length, 
              GL10.GL_UNSIGNED_SHORT, indexBuffer); 

    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}

public void setBuffer() {

            ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);
            vbb.order(ByteOrder.nativeOrder());
            verticesBuffer = vbb.asFloatBuffer();
            verticesBuffer.put(vertices);
            verticesBuffer.position(0);

            ByteBuffer ibb = ByteBuffer.allocateDirect(indices.length * 2);
            ibb.order(ByteOrder.nativeOrder());
            indexBuffer = ibb.asShortBuffer();
            indexBuffer.put(indices);
            indexBuffer.position(0);            
}

public void setVertices(float[] verticesAl, short[] indicesAl){

    this.vertices = verticesAl;
    this.indices = indicesAl;       

}

}


上面类的对象数组的函数。

public void setVertices(float[] vertice, short[] indice, int lineNumber){
    this.vertices = vertice;
    this.indices = indice;
    this.number = lineNumber;

 linetest[number] = new LINETEST();
 linetest[number].setVertices(vertices, indices);               
 linetest[number].setBuffer();

}

最后,使用上面的函数绘制OnDraw方法。它在渲染器类中运行。

@Override
public void onDrawFrame(GL10 gl) {

     int OBJL = 30;
     switch (OBJL){
     case 30:
         if(vertices != null){
             if(linetest[number] != null){
                for(int i = 0; i<number; i++){
                    linetest[number].draw(gl);
                }
                 linetest[number].draw(gl);
             }

         }else{
             break;
         }
    }

}

1 个答案:

答案 0 :(得分:2)

您可以使用glDrawArrays()glDrawElements()仅使用一次GL调用来渲染数组。

参考文献:

http://www.opengl.org/sdk/docs/man/xhtml/glDrawArrays.xml http://www.opengl.org/sdk/docs/man/xhtml/glDrawElements.xml

例如:

// Vertices are stored in counter-clockwise order
float vertsCoords[] = {-1.0f, 1.0f, 0.0f, // V1
                        1.0f, 1.0f, 0.0f, // V2
                        0.0f, 0.0f, 0.0f, // V3
                    };

@Override
public void onDrawFrame(GL10 gl) {
    gl.glEnableClientState(GL10.GL_GL_VERTEX_ARRAY);
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertsCoords); // 3 components per vertex, float in size, from offset 0 at array 'vertsCoords'
    gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3); // draw 3 vertices
    gl.glDisableClientState(GL10.GL_GL_VERTEX_ARRAY);
}

这可能看起来像很多代码,但你最终只会发送4个GL调用而不是至少是objectArray.length调用。

如果你想更进一步,你可以看看顶点缓冲区对象:

http://www.learnopengles.com/android-lesson-seven-an-introduction-to-vertex-buffer-objects-vbos/