Прорисовка деревьев в OpenGL во времени и пространстве требует больших затрат. В настоящее время я экспериментирую с созданием и рисованием сетки из нескольких десятков деревьев одновременно, которая регулярно обновляется по мере движения персонажа, чтобы не отставать. Однако при каждом перераспределении одних и тех же буферов вершин дерева доступная память уменьшается. Я пробовал принудительно собирать мусор после каждого перераспределения, но это только замедляет утечку. Есть ли способ избежать этого?
Код с отслеживаемой памятью.
Log.d("memorytest","maketree before TreeA usedMemInMB "+((gamepanel.runtime.totalMemory() - gamepanel.runtime.freeMemory()) / 1048576L)+
" maxHeapSizeInMB "+(gamepanel.runtime.maxMemory() / 1048576L)+" availHeapSizeInMB "+
((gamepanel.runtime.maxMemory() / 1048576L)-((gamepanel.runtime.totalMemory() - gamepanel.runtime.freeMemory())/1048576L)));
myglrenderer.TreeAGridPositions = ByteBuffer.allocateDirect(terrain_positiondata.length * mBytesPerFloat)
.order(ByteOrder.nativeOrder()).asFloatBuffer();
myglrenderer.TreeAGridPositions.put(terrain_positiondata).position(0);
myglrenderer.TreeAGridNormals = ByteBuffer.allocateDirect(terrain_normaldata.length * mBytesPerFloat)
.order(ByteOrder.nativeOrder()).asFloatBuffer();
myglrenderer.TreeAGridNormals.put(terrain_normaldata).position(0);
myglrendererTreeAGridTextures = ByteBuffer.allocateDirect(terrain_texturedata.length * mBytesPerFloat)
.order(ByteOrder.nativeOrder()).asFloatBuffer();
myglrenderer.TreeAGridTextures.put(terrain_texturedata).position(0);
Log.d("memorytest","maketree before TreeB usedMemInMB "+((gamepanel.runtime.totalMemory() - gamepanel.runtime.freeMemory()) / 1048576L)+
" maxHeapSizeInMB "+(gamepanel.runtime.maxMemory() / 1048576L)+" availHeapSizeInMB "+
((gamepanel.runtime.maxMemory() / 1048576L)-((gamepanel.runtime.totalMemory() - gamepanel.runtime.freeMemory())/1048576L)));
myglrenderer.TreeBGridPositions = ByteBuffer.allocateDirect(terrain_positiondata.length * mBytesPerFloat)
.order(ByteOrder.nativeOrder()).asFloatBuffer();
myglrenderer.TreeBGridPositions.put(terrain_positiondata).position(0);
myglrenderer.TreeBGridNormals = ByteBuffer.allocateDirect(terrain_normaldata.length * mBytesPerFloat)
.order(ByteOrder.nativeOrder()).asFloatBuffer();
myglrenderer.TreeBGridNormals.put(terrain_normaldata).position(0);
myglrendererTreeBGridTextures = ByteBuffer.allocateDirect(terrain_texturedata.length * mBytesPerFloat)
.order(ByteOrder.nativeOrder()).asFloatBuffer();
myglrenderer.TreeBGridTextures.put(terrain_texturedata).position(0);
Log.d("memorytest","maketree after TreeB usedMemInMB "+((gamepanel.runtime.totalMemory() - gamepanel.runtime.freeMemory()) / 1048576L)+
" maxHeapSizeInMB "+(gamepanel.runtime.maxMemory() / 1048576L)+" availHeapSizeInMB "+
((gamepanel.runtime.maxMemory() / 1048576L)-((gamepanel.runtime.totalMemory() - gamepanel.runtime.freeMemory())/1048576L)));
Результаты:
----
maketree before TreeA usedMemInMB 286 maxHeapSizeInMB 512 availHeapSizeInMB 226
maketree after TreeA usedMemInMB 335 maxHeapSizeInMB 512 availHeapSizeInMB 177
maketree after TreeB usedMemInMB 396 maxHeapSizeInMB 512 availHeapSizeInMB 116
maketree before TreeA usedMemInMB 384 maxHeapSizeInMB 512 availHeapSizeInMB 128
maketree after TreeA usedMemInMB 437 maxHeapSizeInMB 512 availHeapSizeInMB 75
maketree after TreeB usedMemInMB 433 maxHeapSizeInMB 512 availHeapSizeInMB 79
-----
maketree before TreeA usedMemInMB 429 maxHeapSizeInMB 512 availHeapSizeInMB 83
maketree after TreeA usedMemInMB 500 maxHeapSizeInMB 512 availHeapSizeInMB 12
maketree after TreeB usedMemInMB 501 maxHeapSizeInMB 512 availHeapSizeInMB 11
-----
outofmemoryerror
Результаты со сборкой мусора после каждого перераспределения.
maketree before TreeA usedMemInMB 292 maxHeapSizeInMB 512 availHeapSizeInMB 220
maketree after TreeA usedMemInMB 346 maxHeapSizeInMB 512 availHeapSizeInMB 166
maketree after TreeB usedMemInMB 397 maxHeapSizeInMB 512 availHeapSizeInMB 115
maketree after Runtime.getRuntime().gc() usedMemInMB 376 maxHeapSizeInMB 512 availHeapSizeInMB 136
----
maketree before TreeA usedMemInMB 392 maxHeapSizeInMB 512 availHeapSizeInMB 120
maketree after TreeA usedMemInMB 404 maxHeapSizeInMB 512 availHeapSizeInMB 108
maketree after TreeB usedMemInMB 448 maxHeapSizeInMB 512 availHeapSizeInMB 64
maketree fter Runtime.getRuntime().gc() usedMemInMB 383 maxHeapSizeInMB 512 availHeapSizeInMB 129
----
maketree before TreeA usedMemInMB 433 maxHeapSizeInMB 512 availHeapSizeInMB 79
maketree after TreeA usedMemInMB 432 maxHeapSizeInMB 512 availHeapSizeInMB 80
maketree after TreeB usedMemInMB 501 maxHeapSizeInMB 512 availHeapSizeInMB 11
maketree after Runtime.getRuntime().gc() usedMemInMB 457 maxHeapSizeInMB 512 availHeapSizeInMB 55
----
maketree before TreeA usedMemInMB 492 maxHeapSizeInMB 512 availHeapSizeInMB 20
maketree after TreeA usedMemInMB 485 maxHeapSizeInMB 512 availHeapSizeInMB 27
maketree after TreeB usedMemInMB 510 maxHeapSizeInMB 512 availHeapSizeInMB 2
maketree after Runtime.getRuntime().gc() usedMemInMB 467 maxHeapSizeInMB 512 availHeapSizeInMB 45
----
maketree before TreeA usedMemInMB 485 maxHeapSizeInMB 512 availHeapSizeInMB 27
outofmemoryerror
Подробнее здесь: https://stackoverflow.com/questions/793 ... -in-opengl
Как избежать утечки памяти при повторном использовании буферов положения, нормалей и текстур в OpenGL ⇐ Android
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение