Я пишу несколько сложный игровой движок в Android.Android: Обновление потока заставляет GC запускать тонну
В настоящее время у меня есть поток, используемый для обновления подсистем.
Внутри метода обновления используется метод обновления игровой логики, основанный на текущем состоянии игры.
Состояние игры имеет сцену, которая обновляется. Сцены состоят из корневого узла, который создает простую структуру графа сцены.
Корни являются узлами, у которых есть дети, которые также обновляются и так далее, и так далее.
В любом случае, это все хорошо и хорошо, и отлично работает, пока я не получу миллион из них в моем Logcat: 03-29 09: 23: 22.866: D/dalvikvm (18554): GC_CONCURRENT освобожден 511K, 52% бесплатно 2773K/5767K, внешний 77K/587K, приостановленный 2ms + 3ms
Я выделил причину утечки как цикл обновления, так как, когда я прокомментирую мой метод обновления подсистем, сообщений 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) Там нет утечек! Мой ум настолько ошеломлен. Спасибо, парни.
Хорошая новость: Ваша утечка не вызов OnUpdate(). Это код внутри этого метода. Добавьте соответствующие фрагменты кода. – WarrenFaith
Просьба показать определение 'children' и связанного с ним метода' onUpdate'. – Gray
О, и каждый раз, когда вы вызываете 'size()' в цикле, умирает котенок. Вы должны проверить руководство по эффективности в официальной документации :) – WarrenFaith