我将尝试在当前的'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;
}
}
}
答案 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/