Вторая итерация паттерна Pool для JavaScript. Вкратце, Pool — это место для хранения объектов, которые то появляются, то исчезают. Pool позволяет создать их заранее в нужном количестве, а затем повторно использовать, избегая вызова Garbage Collector. Паттерн, который необходим для гейм-девелопинга во всех языках с автоматической сборкой мусора.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
function Pool(size, objectCreateFunction) { this.freeAmount = 0; this.objects = []; this.add = function (object) { this.objects[this.freeAmount++] = object; }; for (var i = 0; i < size; i++) { this.add(objectCreateFunction()); // заполняем пул } this.get = function () { var newObj = null; // the pool contains objects : grab one if (this.freeAmount > 0) { this.freeAmount--; newObj = this.objects[this.freeAmount]; this.objects[this.freeAmount] = null; // очищаем массив } else { // the pool is empty : create new object newObj = objectCreateFunction(); } return newObj; }; this.free = function (object) { if (this.objects.indexOf(object) == -1) { this.add(object); } }; } |
Код я публикую на правах ревю. То есть публикация любого кода в моем блоге не означает, что он правильный и хороший. Критика приветствуется.
Пример использования Pool
Для всплывающих пузырьков в кликере — сначала создаю пул с пузырьками
1 2 3 |
this.pool = new Pool(this.POOL_SIZE, function () { return new FloatingLootElement(game) }); |
При запуске эффекта всплывания
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// запуск анимации лута FloatingLoot.prototype.float = function (x, y, lootType, lootValue) { var floater = this.pool.get(); // берем из пула floater.set(lootType, lootValue); // устанавливаем актуальные параметры // коллбэк по завершении анимации всплывания floater.setCallback(function () { this.pool.add(floater); // возвращаем в пул // ... }, this); floater.float(x, y); // старт анимации }; |