0

我将尝试在当前的“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;
         }
    }

}

4

1 回答 1

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/

于 2013-10-02T15:19:44.410 回答