我对Android很新,我正在编写我的第一个应用程序,它包括绘制STL数据(一堆三角形)。 对于少量三角形(~4000),我的应用效果很好。但是一旦我尝试加载大数据(~100000个三角形),我就会遇到内存分配问题。这基本上就是我做的事情:
我正在使用GLSurfaceView进行渲染
a)我读了我的数据,创建了一个三角形列表(3 * X / Y / Z和每个三角形的法线向量) b)我使用allocateDirect()为顶点数据,法线和索引创建ByteBuffers。 c)我将数据添加到ByteBuffers中 d)我调用glVertexPointer,glNormalPointer并分配字节缓冲区 e)我使用indexBuffer
调用glDrawElements()当我尝试通过调用allocateDirect()来分配大约10MB时,我的应用程序崩溃了。我试着调用allocate()代替它,但是然后glVertexPointer方法崩溃了(即使对于少量的三角形)
我做错了吗?
另外,每次重绘时都需要调用glVertexPointer,glNormalPointer还是在surfaceChanged方法中调用它?
非常感谢,
标记
答案 0 :(得分:1)
您应该只创建一次VBO。之后,如果您需要将新数据加载到它们中,您可以在本地数组中执行此操作,然后使用“put”调用将其一次性加载到VBO中。
可用于索引VBO的最大类型是“short”,因此一次只能绘制64k顶点。如果要绘制100k顶点,则必须在两遍中完成。
编辑:关于您的内存限制,请找出您的设备的堆限制。堆限制可以是16,24,32或48 MB。您可以使用“android:largeHeap =”true“”选项来大大增加限制,但我不确定该选项是否适用于Android之前的Honeycomb版本。
答案 1 :(得分:0)
我不擅长3D渲染,但是10MB的顶点数据让我感到非常震撼,特别是对于移动应用程序,所以我对你遇到内存分配问题并不感到惊讶!即使他们成功地获得了分配,但由于性能不佳,您可能会发现它无法使用。
整个场景是否真的需要一直在视频内存中?您可能希望探索剔除远离相机的顶点并仅上传/绘制所需内容的技术。