Android OutOfMemory问题
我正在解析设备上的二进制文件,并将我关心的字段存储在数组中。这些文件可以生成大小为100000的数组。当然,java告诉我内存不足(我认为android只允许每个应用程序有16MB的内存) 是否有其他方法获取这些数据 基本上,我解析点和颜色信息,将其存储在数组中,然后使用vertexBuffers在OpenGL中绘制它们。将它们存储在数据库中对我没有帮助,是吗 谢谢大家! 编辑: 我对一个有482000个点的文件进行了解析。它存储位置和颜色而不会崩溃。我在调试器中看到了这一点:Android OutOfMemory问题,android,sql,memory,out-of-memory,Android,Sql,Memory,Out Of Memory,我正在解析设备上的二进制文件,并将我关心的字段存储在数组中。这些文件可以生成大小为100000的数组。当然,java告诉我内存不足(我认为android只允许每个应用程序有16MB的内存) 是否有其他方法获取这些数据 基本上,我解析点和颜色信息,将其存储在数组中,然后使用vertexBuffers在OpenGL中绘制它们。将它们存储在数据库中对我没有帮助,是吗 谢谢大家! 编辑: 我对一个有482000个点的文件进行了解析。它存储位置和颜色而不会崩溃。我在调试器中看到了这一点: Grow hea
Grow heap (frag case) to 43.164MB for 23156032-byte allocation
Forcing collection of SoftReferences for 30874704-byte allocation
Out of memory on a 30874704-byte allocation
错误在java.nio.ByteBuffer.allocateDirect
我已将该代码区域包括在下面:
//Parse file and populate arrays
PointParser(fileName, header);
// a float is 4 bytes, therefore we multiply the number if
// vertices with 4.
ByteBuffer vbb = ByteBuffer.allocateDirect(lasVertices.length * 4);
vbb.order(ByteOrder.nativeOrder());
vertexBuffer = vbb.asFloatBuffer();
vertexBuffer.put(lasVertices);
vertexBuffer.position(0);
ByteBuffer cbb = ByteBuffer.allocateDirect(lasColors.length * 4);
cbb.order(ByteOrder.nativeOrder());
colorBuffer = cbb.asFloatBuffer();
colorBuffer.put(lasColors);
colorBuffer.position(0);
我不知道它是否能帮助你,但是这里有很多来自谷歌关于内存管理的交互建议:我不知道它是否能帮助你,但是这里有很多来自谷歌关于内存管理的交互建议:@Francesco我有几个浮点数数组。我希望以某种方式使用一个数据库,但我不知道我是否可以用OpenGL顶点绘制来实现……你需要一次加载所有的数据库吗?如果你不是一次性绘制100000多个点,那么为什么不分解你正在做的事情,只创建/加载/处理你当时需要的东西呢?@Poldie我正在处理一个特殊的3D点云。我对android上OpenGL ES的理解是,你将一个数组指向一个顶点缓冲区,然后它从那里绘制它。我不知道如何动态交换数据,以便绘制所有数据。。。这有意义吗谢谢。在OpenGL中,没有理由不能执行多个调用。例如,在100次呼叫中,每次都绘制1000个点。但16MB应该足以容纳100000个点。100000*3(x,y)*4(每点字节数)比一兆兆多一点。内存不足是什么时候发生的?它是在文件读取过程中还是在渲染过程中发生的?@Francesco我有几个浮点数数组。我希望以某种方式使用一个数据库,但我不知道我是否可以用OpenGL顶点绘制来实现……你需要一次加载所有的数据库吗?如果你不是一次性绘制100000多个点,那么为什么不分解你正在做的事情,只创建/加载/处理你当时需要的东西呢?@Poldie我正在处理一个特殊的3D点云。我对android上OpenGL ES的理解是,你将一个数组指向一个顶点缓冲区,然后它从那里绘制它。我不知道如何动态交换数据,以便绘制所有数据。。。这有意义吗谢谢。在OpenGL中,没有理由不能执行多个调用。例如,在100次呼叫中,每次都绘制1000个点。但16MB应该足以容纳100000个点。100000*3(x,y)*4(每点字节数)比一兆兆多一点。内存不足是什么时候发生的?它是在文件读取期间还是在渲染例程期间发生的?
public void draw(GL10 gl) {
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);
}