问题描述
|
我是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的顶点数据对我来说确实有很多好处,尤其是对于移动应用程序而言,因此您遇到内存分配问题并不感到惊讶!即使成功分配了它们,由于性能不佳,您仍可能会发现它不可用。
整个场景是否真的需要一直存储在视频存储器中?您可能想探索一些技巧,以剔除远离相机的顶点,仅上载/绘制必要的顶点。