Несколько светильников на одном теле или нескольких телах?
Скажем, я хотел создать 1000 или даже 5000 статических линий тела на экране. Мне интересно, какова разница между прикреплением всех этих линий (светильников) к одному телу или размещением каждого приспособления на его собственном теле. Существует ли разница в производительности между этими двумя методами или один метод обеспечивает большую функциональность или контроль над другим методом?
Ниже показано различие между обоими методами.
Прикрепление каждой строки к одному телу:
// Create our body definition
BodyDef groundBodyDef = new BodyDef();
groundBodyDef.type = BodyType.StaticBody;
// Create a body from the defintion and add it to the world
Body groundBody = world.createBody(groundBodyDef);
for (int i = 0; i < 1000; i++) {
// Create our line
EdgeShape ground = new EdgeShape();
ground.set(x1, y1, x2, y2);
groundBody.createFixture(ground, 0.0f);
ground.dispose();
}
Прикрепление каждой строки к собственному телу:
// Create our body definition
BodyDef groundBodyDef = new BodyDef();
groundBodyDef.type = BodyType.StaticBody;
for (int i = 0; i < 1000; i++) {
// Create a body from the defintion and add it to the world
Body groundBody = world.createBody(groundBodyDef);
// Create our line
EdgeShape ground = new EdgeShape();
ground.set(x1, y1, x2, y2);
groundBody.createFixture(ground, 0.0f);
ground.dispose();
}
Этот пример кода определенно в libGDX, однако я предполагаю, что это довольно простая концепция box2D, и на него можно ответить даже без опыта работы с libGDX.
Одним из примеров возможной разницы в функциональности является то, что если все строки привязаны к одному телу, и мы должны были бы вызвать world.destroyBody(groundBody);
, это также уничтожило бы все строки, однако, если каждая строка привязана к другому тело, мы уничтожим только одну строку.
Разве даже это имеет существенное значение? Мы можем просто вызвать groundBody.destroyFixture(fixture);
, чтобы уничтожить одну строку, если все они прикреплены к одному телу.
Ответы
Ответ 1
Из Box2D Manual (7.3 Тело Factory):
Быстрее прикреплять несколько фигур к статическому телу, чем создавать несколько статических тел с одной формой на каждом из них. Внутренне Box2D устанавливает массу и обратную массу статических тел в нуль. Эта делает математику работать так, что большинство алгоритмов не нужно лечить статические тела как частный случай.
Это действительно более результативно. Это заметно? зависит, если у вас много тел с одним креплением, и вы делаете их креплениями одного тела, но, вероятно, не для большинства игр.
Я бы порекомендовал вам использовать тот, который проще реализовать, и сделать его более эффективным, когда вам это действительно нужно.
Ответ 2
Использование памяти также может быть рассмотрено.
По крайней мере, в версии Box2D на С++ каждое тело занимает фиксированный объем памяти, как и каждый прибор, и каждая форма. Таким образом, объединение каждого приспособления с собственным телом будет обладать большей памятью, чем создание нескольких приборов внутри одного тела. Такое же количество светильников и форм будет использовано в любом случае, но в первом случае используются больше тел.
Чтобы дать представление о потреблении памяти, в С++ b2Body
используется 184-байтная память на 64-битной платформе, я просто распечатал результат sizeof(b2Body)
on.