我正在分析一个包含顶点及其属性的二进制文件。这些文件的顶点范围为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正在复制数据,则不会有两个副本。