저는 정점과 그 속성을 가진 이진 파일을 구문 분석합니다. 이 파일의 범위는 50,000-2,000,000 개의 정점입니다. 낮은 파일의 경우 배열을 직접 할당하고 점을 그리는 데 문제가 없지만 큰 파일의 경우 큰 문제입니다. 나는 같은 floatbuffer을 만들 때Android OpenGL OutOfMemory (버퍼 할당)
:
FloatBuffer buf = ByteBuffer.allocateDirect(vertices.length * 4);
가끔 에서 OutOfMemory 오류를 얻을. 이것은 내가 그린 유일한 버퍼가 아니며, 또한 컬러를 사용합니다. 꼭지점을 그리거나 버퍼에 즉시 할당하는 더 좋은 방법이 있습니까? 매번 그립니다. new ProgressTask(ctx).execute();
단지 구문 분석하고 배열을 채 웁니다
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);
}
호출 : 여기 내가 사용하고있는 몇 가지 기본적인 그리기 코드입니다. 나는 파일을 계속 파싱 할 여유가 없으며, 너무 오래 걸린다. 어떤 옵션이 있습니까?
OutOfMemory 오류가 발생하는 코드 줄은 무엇입니까? – DoomGoober
@DoomGoober - vbb = ByteBuffer.allocateDirect (lasVertices.length * 4); – RedLeader