Как избежать утечки памяти при повторном использовании буферов положения, нормалей и текстур в OpenGLAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Как избежать утечки памяти при повторном использовании буферов положения, нормалей и текстур в OpenGL

Сообщение Anonymous »

Прорисовка деревьев в 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»