現在我有超過300萬個點需要處理。我正在使用openGL
和它的verticesbuffer
來存儲它們。所以,頂點數組大約有900萬個元素(每個點有x,y,z)。當我將它們加載到float數組中時,它通過拋出java.lang.OutOfMemoryError
異常來崩潰app。
我試圖將它分成幾個數組,但是如何在單個渲染中一個接一個地繪製它們?或創建多個呈現來處理不同的頂點數組?
這裏是我的呈現類
Android openGL:處理數組中的大型數據集(點雲)
public class Render implements Renderer{
private Points points;
public Render(){
//do nothing
}
@Override
public void onDrawFrame(final GL10 gl) {
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
points.draw(gl);
}
@Override
public void onSurfaceChanged(final GL10 gl, final int width, final int height) {
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
GLU.gluPerspective(gl, 125.0f, (float)width/(float)height, 50f, 500f);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
}
@Override
public void onSurfaceCreated(final GL10 gl, final EGLConfig config) {
/**pass Point array to points class */
points = new Points(arrayPoints);
}
這裏是我的觀點類
private float[] vertices;
private FloatBuffer vertexBuffer;
public Points(final float[] pointsArray){
this.vertices=pointsArray;
ByteBuffer byteBuf = ByteBuffer.allocateDirect(vertices.length *4);
byteBuf.order(ByteOrder.nativeOrder());
vertexBuffer = byteBuf.asFloatBuffer();
vertexBuffer.put(vertices);
vertexBuffer.position(0);
}
public void draw(final GL10 gl) {
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
/**point size*/
gl.glPointSize(1);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
gl.glDrawArrays(GL10.GL_POINTS, 0, vertices.length/3);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}
我想我需要展示他們。他們是地貌數據。用戶應該能夠詳細查看它們。你是什麼意思通過流?你能提供更多細節嗎? –
在「縮小」級別顯示它們的有限分辨率,並在「放大」級別顯示更多有限範圍的細節。想想谷歌地圖如何展現街道 - 當你看到整個國家時,你只能看到高速公路,但是當你放大時,你會看到一切。 – Codeman