Несколько светильников на одном теле или нескольких телах?

Скажем, я хотел создать 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.