Изучаю исходный код Three.js и наткнулся на интересную конструкцию в классе Object3D. Там метод rotateX реализован таким образом:
rotateX: function () {
var axis = new THREE.Vector3( 1, 0, 0 );
return function ( rotation ) {
return this.rotateOnAxis( axis, rotation );
};
}(),
Не понимаю, зачем так усложнять. Ведь можно было бы написать проще:
rotateX: function (rotation) {
var axis = new THREE.Vector3( 1, 0, 0 );
this.rotateOnAxis( axis, rotation );
},
В чем преимущество первого подхода? Есть ли какие-то соображения производительности или это просто стиль кодирования? Понимаю что это больше вопрос по JavaScript, но интересно узнать мнение сообщества.
Создавать Vector3 объекты дорого. В первом варианте вектор создается раз при инициализации и переиспользуется. Во втором - новый Vector3 создается при каждом вызове rotateX. Если анимация крутит объект каждый кадр, разница в производительности будет заметна. Стандартная оптимизация для игровых движков и 3D библиотек.
Дело в том, что сборщик мусора срабатывает каждый раз, когда создаешь объекты в циклах анимации. С замыканием переменная axis остается в памяти и не пересоздается постоянно. Это критично, когда у тебя сотни объектов вращаются - без оптимизации начинаются фризы. Я сам с этим столкнулся в сцене с кучей вращающихся элементов. После таких оптимизаций производительность сразу стала лучше.