OpenGL绘图的内存分配问题

问题描述

| 我是Android的新手,我正在写我的第一个应用程序,其中包含绘制STL数据(一堆三角形)。 对于少数三角形(〜4000个),我的应用程序运行良好。但是,一旦我尝试加载大数据(〜100000个三角形),就会遇到内存分配问题。这基本上是我的工作: 我正在使用GLSurfaceView进行渲染 a)我读入数据,创建了一个三角形列表(3 * X / Y / Z和每个三角形的法向矢量) b)我使用allocateDirect()为顶点数据,法线和索引创建ByteBuffer。 c)我将数据添加到ByteBuffers中 d)我调用glVertexPointer,glnormalPointer并分配字节缓冲区 e)我使用indexBuffer调用glDrawElements() 一旦我尝试通过调用allocateDirect()分配大约10MB的内存,我的应用程序就会崩溃。我试着调用calllallocate(),它可以工作,但是glVertexPointer方法崩溃了(即使是少数三角形) 难道我做错了什么? 另外,我每次重画时都必须调用glVertexPointer,glnormalPointer还是足以在surfaceChanged方法调用它? 非常感谢, 标记     

解决方法

您只能创建一次VBO。此后,如果需要将新数据加载到它们中,则可以在本地阵列中进行处理,然后使用“ put \”调用将其一次全部加载到VBO中。 可以用于索引VBO的最大类型是\“ short \”,因此一次只能绘制64k顶点。如果要绘制10万个顶点,则必须分两次进行。 编辑:关于您的内存限制,找出什么是您的设备的堆限制。堆限制可以是16、24、32或48 MB。您可以使用\“ android:largeHeap = \” true \“ \”选项来大大增加限制,但是我不确定该选项是否适用于蜂窝版之前的Android。     ,我不是3D渲染方面的专家,但是10MB的顶点数据对我来说确实有很多好处,尤其是对于移动应用程序而言,因此您遇到内存分配问题并不感到惊讶!即使成功分配了它们,由于性能不佳,您仍可能会发现它不可用。 整个场景是否真的需要一直存储在视频存储器中?您可能想探索一些技巧,以剔除远离相机的顶点,仅上载/绘制必要的顶点。