Я нахожусь в середине огромного приложения в команде разработчиков, и память - это то, что нужно рассмотреть на ранней стадии. Когда я запускаю программу как есть, она занимает около 44 МБ памяти (найдена из диспетчера задач). Затем я создаю 10 000 тел. Использование памяти теперь составляет около 83 МБ. У меня есть метод уничтожения тел, когда я нажимаю пробел, вот как он выглядит.
public static void disposeAllBodies(){
Array<Body> bodies = new Array<Body>();
world.getBodies(bodies);
int destroyCount = 0;
System.out.println("Attempting to destroy " + world.getBodyCount()+ " bodies");
for(Body b : bodies){
world.destroyBody(b);
destroyCount++;
}
System.out.println("Successfully destroyed " + destroyCount + " body(s), " + world.getBodyCount() + " remain");
}
Он без проблем располагает всеми телами, и это были единственные вещи в приложении. После того, как они расположены, память опускается примерно до 66 МБ в течение нескольких секунд, а затем перескакивает до 78 МБ и остается там.
Итак, мне интересно, есть ли лучший способ распорядиться этими телами? Это приложение будет создавать миллионы тел, но большинство из них будет уничтожено, однако, если память просто продолжает расти, она не сможет справиться с этим, поскольку память остается довольно статической.
Кроме того, CPU идет от 0,2% (до любых тел) до 23% (при наличии 10 000 тел), тогда до 2,3% (при размещении тел). Поэтому даже центральный процессор делает больше работы после утилизации тел.
Спасибо за любую помощь!
Обновление: Код для создания тел выглядит следующим образом:
BodyDef bodyDef = new BodyDef();
bodyDef.type = type;
bodyDef.position.set(new Vector2(position.x, position.y));
Body body = world.createBody(bodyDef);
FixtureDef fixtureDef = new FixtureDef();
Fixture fixture;
if(isCircle){
CircleShape circle = new CircleShape();
circle.setRadius(dimensions.x);
fixtureDef.shape = circle;
fixture = body.createFixture(fixtureDef);
circle.dispose();
}else{
PolygonShape rectangle = new PolygonShape();
rectangle.setAsBox(dimensions.x, dimensions.y);
fixtureDef.shape = rectangle;
fixture = body.createFixture(fixtureDef);
rectangle.dispose();
}
Это всего лишь тела Box2D, никаких спрайтов и ничего. Спасибо!