Я пишу несколько сложный игровой движок в Android.
В настоящее время у меня есть нить, используемая для обновления подсистем.
Внутри метода обновления находится метод обновления игровой логики, которыйна основе текущего игрового состояния.
В игровом состоянии есть сцена, которая обновляется.Сцены состоят из корневого узла, который образует простую структуру графа сцены.
Корни - это узлы, у которых также есть дочерние элементы, которые также обновляются и т. Д. И т. Д.
В любом случае, это всекрасиво и модно и прекрасно работает, пока я не получу миллион таких в своем Logcat: 03-29 09: 23: 22.866: D / dalvikvm (18554): GC_CONCURRENT освободил 511K, 52% свободных 2773K / 5767K, внешние 77K / 587K,пауза 2 мс + 3 мс
Я выделил причину утечки в цикле обновления, так как, когда я закомментирую свой метод обновления подсистем, сообщений GC нет.Более того, я прокомментировал глубоко в цикле обновления, и вплоть до момента, когда обновление дочерних узлов корневого узла является точкой, когда GC будет работать неистово.
(GameLgoic)
public void onUpdate(float deltaTime)
{
if (gameState != null)
gameState.onUpdate(deltaTime);
}
(GameState)
public void onUpdate(float deltaTime)
{
scene.onUpdate(deltaTime);
}
(Scene)
public void onUpdate(float deltaTime)
{
root.onUpdate(deltaTime);
}
(SceneNode)
public void onUpdate(float deltaTime)
{
for (int i = 0; i < children.size(); ++i)
{
children.get(i).onUpdate(deltaTime); // Memory leak runs crazily here
}
}
Если я закомментирую children.get (i) .onUpdate (deltaTime) Утечек нет!Мой разум так поражен.Спасибо, ребята.