2014-01-09 118 views
0

現在我有超過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); 

} 

回答

1

你可能溢出堆大小。較新的手機最大堆大小爲256MB。這是一個應用程序的最大尺寸。

你可以找到更多關於這here的細節。

一個解決方案是將這些交替存儲 - 您是否真的需要顯式地顯示900萬個頂點?你能以某種方式流出它們嗎?

+0

我想我需要展示他們。他們是地貌數據。用戶應該能夠詳細查看它們。你是什​​麼意思通過流?你能提供更多細節嗎? –

+0

在「縮小」級別顯示它們的有限分辨率,並在「放大」級別顯示更多有限範圍的細節。想想谷歌地圖如何展現街道 - 當你看到整個國家時,你只能看到高速公路,但是當你放大時,你會看到一切。 – Codeman

0

另一種解決方案是使用NDK。沒有嚴格的內存限制。

+0

我使用ndk來讀取所有點。你的意思是在本機代碼中使用openGL嗎? –

+0

不要嘗試使用Java加載大型數據集。在NDK中執行所有處理,包括OpenGL調用。 – Lev