2016-01-23 2 views
3

(я использую Dev ветвь HaxeFlixel)Правильный способ создания экземпляра FlxPoint

Чтобы создать новую переменную FlxPoint я могу сделать один из трех вещей ...

var pt:FlxPoint = new FlxPoint(); 
var pt:FlxPoint = FlxPoint.weak(); 
var pt:FlxPoint = FlxPoint.get(); 

От чтения комментарии метода, я выяснил, что существует какой-то пул, который, вероятно, ускорит создание FlxPoint. При каких обстоятельствах я должен использовать каждый из трех способов создания нового FlxPoint?

У меня есть несколько функций, которые либо принимают FlxPoint s в качестве параметров, либо возвращают их. Должен ли я скопировать то, что делает , и использовать .weak() для их создания, а .putWeak() - перечислить пункты, переданные в функции?

Мне кажется, что .get() предназначен для долговечных переменных (начальные позиции игрока, точки, хранящиеся в массиве для поиска путей и т. Д.), И .weak() для временных (промежуточные значения, вычисленные внутри функции). Это правильно?

ответ

2

FlxPoint обеспечивает механизм объединения, который должен помочь уменьшить сбор мусора.

FlxPoint.get() пытается извлечь неиспользованную точку из пула. Если его нет, это фактически то же самое, что и new FlxPoint(). Любой из них может быть переработан, будучи put() обратно в бассейн.

weak() больше о используется для библиотечных вызовов, чем продолжительность жизни (хотя это часто делает в виду, что это недолго) - вот его документация:

корзины или создать новый FlxPoint, который автоматически будет выпущен пул при переходе в функцию фликселя.

Это означает, что вам не нужно беспокоиться о сохранении ссылки на точки поворота и переработки его в этом примере, так как rotate() звонки putWeak() на него для вас:

point.rotate(FlxPoint.weak(0, 0), 45); 
+0

Мне жаль, что я не могу отметить все три ответа как «правильные», но ваш бит о библиотечных вызовах объясняет это лучше всего. Функции библиотеки, принимающие FlxPoints, должны попытаться их освободить и должны их слабо создавать, потому что они могут быть похожими на ваш пример поворота, которые будут вызываться каждый кадр несколько раз. – Piku

1

Вы в значительной степени верный.

var pt:FlxPoint = new FlxPoint(); Это создает новый FlxPoint, не добавляя его в «пул» или не устанавливая его как слабый. «Слабый» FlxPoint - это тот, который будет уничтожен после передачи стандартного метода haxeflixel. Опять же, вызов new делает его не слабым, а не пулом.

Как вы сказали, это полезно для более постоянных FlxPoints, таких как хранение, где начинается уровень.


var pt:FlxPoint = FlxPoint.weak(); Это идентичен вызову new FlxPoint однако он также устанавливает точку быть слабым. Слабый FlxPoint перерабатывается, как только он используется в функции Haxeflixel. Он не находится в пуле по умолчанию, но будет добавлен в пул, если вызывается .putWeak(). putWeak() просто перерабатывает временный (слабый) FlxPoint. Хотя putWeak() находится в коде haxeflixel, вы можете так же легко позвонить putWeak, если хотите отменить временный слабый FlxPoint.

Это наиболее полезно для точек, которые используются во время временных расчетов. Вы можете видеть, что он используется в самой FlxPoint, когда математика делает между двумя точками (например, когда они added).


var pt:FlxPoint = FlxPoint.get(); Этот метод получения FlxPoint пытается извлечь FlxPoint из пула FlxPoints. Это полезно, потому что извлечение существующей точки из памяти и ее утилизацию дешевле, чем создание новой точки. Вы можете (и должны) вернуть этот пункт обратно в пул, вызывая .put(), когда вы закончите с ним.

Это наиболее полезно, когда вы будете создавать грузы FlxPoint, но только временно их используете. Например, если вам нужно, чтобы FlxPoint показывал, куда попадет пуля, а игрок снимает сотни пуль, переработка FlxPoint из пула намного дешевле, чем вызов new FlxPoint каждой пули.

Как вы можете видеть, все они как-то связаны и очень похожи.

1

FlxPoint.get() извлекает FlxPoint из бассейна и требует, чтобы он был вручную put() обратно, когда вы закончите с ним. Используйте это для долговечных переменных. Вы можете использовать get() в конструкторе и put() в методе destroy класса, который нуждается в переменной-члене.

FlxPoint.weak() дает вам точку, которая возвращается в бассейн, когда на нее вызывается put() или putWeak(). Как вы говорите, лучше использовать их для временных или промежуточных значений. HaxeFlixel делает это для методов, которые принимают FlxPoints, и вы можете следовать этому шаблону и в своем собственном коде.

Создание экземпляра FlxPoint с помощью new создает один без объединения. Сборщик мусора позаботится об этом, если вы не держитесь за ссылки на него. Это нормально, если вы делаете это по-другому, и это нормально, когда производительность или пауза в сборе мусора не являются большой проблемой.

Смежные вопросы