Android OpenGL内存不足(分配缓冲区)



我正在分析一个包含顶点及其属性的二进制文件。这些文件的顶点范围为50000-2000000个。对于较低的文件,我可以直接分配数组和绘制点,但对于较大的文件,这是一个大问题。

当我创建这样的浮动缓冲区时:

FloatBuffer buf = ByteBuffer.allocateDirect(vertices.length * 4);

我有时会出现OutOfMemory错误。这不是我画的唯一缓冲区,我也画颜色。有没有更好的方法来绘制顶点或动态分配到缓冲区,每次我都会绘制?以下是我正在使用的一些基本绘图代码:

public PointCloud(String passedFileName, Context ctx) {
    fileName = passedFileName;
    header = new LAS_HeadParser(fileName);
    numVertices = (int)header.numberOfPoints;
    lasVertices = new float[numVertices*3];
    lasColors = new float[numVertices*4];
    intensity = new float[numVertices];
    vbb = ByteBuffer.allocateDirect(lasVertices.length * 4);
    cbb = ByteBuffer.allocateDirect(lasColors.length * 4);
    new ProgressTask(ctx).execute();
}
public void setupBuffers(){
    // a float is 4 bytes, therefore we multiply the number if 
    // vertices with 4.
    vbb.order(ByteOrder.nativeOrder());
    vertexBuffer = vbb.asFloatBuffer();
    vertexBuffer.put(lasVertices);
    vertexBuffer.position(0);   
    cbb.order(ByteOrder.nativeOrder());
    colorBuffer = cbb.asFloatBuffer();
    colorBuffer.put(lasColors);
    colorBuffer.position(0);
}
public void draw(GL10 gl) {
    //Log.d("Enter Draw", "*****************");
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
    gl.glColorPointer(4, GL10.GL_FLOAT, 0, colorBuffer);
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
    gl.glPointSize(0.6f);
    gl.glDrawArrays(GL10.GL_POINTS, 0, numVertices);
    gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}

调用new ProgressTask(ctx).execute();只是解析和填充数组。我负担不起持续解析文件的费用,它花费的时间太长了。我有什么选择?

1(我不知道你在渲染什么,但渲染50000个GL_POINT似乎很奇怪。如果改为渲染多边形(使用GL_TRIANGLE_STRIP或GL_TRIANGLE_FAN(,则可以将顶点数量减少一半甚至三分之一,具体取决于优化数据的效果。

2( 您可能持有两个对顶点和颜色缓冲区的引用。根据文档allocateDirt可能映射到中间内存,也可能只是复制整个字节[]。让垃圾收集器清理lasVertices和lasColors,方法是在PointCloud构造函数中使它们成为局部变量,而不是将它们作为成员变量。(或者,如果它们必须是成员,则在将它们放入ByteBuffers后将其设置为null。(这样,如果ByteBuffer正在复制数据,则不会有两个副本。

最新更新