Nape 2 — Работаем эффективно с Vec2

В Nape есть класс Vec2 представляющий собой реализацию вектора. Помню, что где то читал на форуме люди жаловались мол много экземпляров этого класса создается, как это уменьшить и т.д. Поставил себе задачу разобраться более глубже с этим классом для эффективного его использования (в рамка моего двига).
Порыл доку, поспрашивал у Луки, почитал сорсы и вот родилась небольшая заметка.

Перед этим создавал векторы через конструктор не задумываясь сильно — new Vec2(0,0);
Но Nape предоставляет систему пула для экземпляров этого класса. Потому, вместо создания экземпляра через конструктор предпочтительней использовать статический метод ‘get‘ — Vec2.get(0,0); В этом случае экземпляр будет браться из пула, а если пул пуст будет создан на лету.
Если есть пул значит как то можно вернуть туда экземпляр. Vec2 предоставляет метод dispose, который возвращает экземпляр в пул для повторного использования.
Еще у метода ‘get‘ есть третий параметр ‘weak‘ (идеологически чем то похоже на «слабые ссылки» в ActionScript, но работает это немного по другому).
Но сначала поговорим о том как работает Nape с классом Vec2.
Практически во всех методах, куда можно передать экземпляр Vec2 (даже в сам же Vec2 — vec.add(v);), Nape никогда не берет этот экземпляр в использование, он всегда копирует данные из него.
То есть, после того как вы передали экземпляр Vec2 в какой либо метод Nape, его можно спокойно удалить.
Например, создадим вектор для гравитации и установим его, а после удалим:

var vector = Vec2.get(x, y);
space.gravity = vector;
vector.dispose();

И все будут целы и сыты — и ‘vector’ вернется в пул и гравитация на месте :)

Теперь ‘weak‘. Если у экземпляра Vec2 параметр weak == true, то после передачи такого экземпляра в любой метод Nape он будет удален.
Например, код выше можно переписать таким образом (это будет равносильно):

var vector = Vec2.get(x, y, true);
space.gravity = vector;

Гравитация установится, а вектор ‘vector’ вернется в пул.

Также есть статический метод Vec2.weak(0,0) для создания «слабых» экземпляров.
Какая разница между Vec2.get(x, y, true) и Vec2.weak(0,0)? Никакой. Абсолютно тоже самое (я считаю этот метод вообще лишний). Если посмотреть в код нейпа то можно увидеть следующее:

public static inline function weak(x:Float = 0, y:Float = 0):Vec2 {
return get(x, y, true);
}

Рассмотрим метод ‘add‘. Он делает сложение двух векторов и возвращает результат новый вектор (старые никак не трогает, если только входящий вектор-параметр не обозначен как ‘weak‘, тогда он его удалит). Вторым параметром можно задать ‘weak‘ = true, тогда возвращаемый вектор-результат будет «слабым».
Пример:

var v = Vec2.get(x, y);
var q = Vec2.get(x, y);
var w = v.add(q);
space.gravity = w;
v.dispose();
q.dispose();
w.dispose();

этот код можно записать следующим образом:

var v = Vec2.get(x, y);
space.gravity = v.add(Vec2.weak(x, y), true);
v.dispose();

или даже так:

space.gravity = Vec2.weak(x, y).addeq(Vec2.weak(x, y));

Метод ‘addeq‘ делает сложение вектора с заданный вектором-параметром, модифицируя этот же вектор не создавая других экземпляров и возвращает ссылку на самого себя. Например, это тоже самое что:

var v:Vec2 = Vec2.get(1,1);
var a:Vec2 = Vec2.get(2,2);
v.set(v.add(a));

Еще интересовался как можно очистить пул с Vec2.
Ответ: в Nape нельзя очистить конкретный пул, но можно очистить все пулы с помощью метода Debug.clearObjectPools();

Поделиться в соц. сетях

Опубликовать в LiveJournal
Опубликовать в Google Plus
  • Alik

    спасибо!

  • VirtualMaestro

    Пожалуйста!

  • Ewanse

    Познавательно, спасибо!
    Хотелось бы почитать такие же тонкости и по геному)

  • VirtualMaestro

    Да, мне тоже хочется разобраться, но Genome очень динамически развивается, в этом есть и свой плюс и свой минус — не всегда успеваешь за ним)). Хотя в последнее время добавляются больше вроде как высокоуровневые фичи, а то перед этим даже пайплайны менялись ))
    Некоторое время решил повременить с новыми версиями (больше занят разработкой игры в данный момент), но за его обновлениями активно слежу.
    Однозначно буду влазить в тонкости, так как есть идея на его основе движок сделать — уж очень мне понравилась идея компонентности и геном хорошее тому подтверждение.

  • Ewanse

    >> есть идея на его основе движок сделать

    Тоже планирую переписать свой движок на ядро генома.
    И если автор все-таки откроет исходники это будет очень здорово.
    + автор упоминал о Genome2DNape physics extensions, вот это будет бомба =)

  • Алексей

    Круть

  • Sergey Smirnov

    Супер! Очень полезная статья!