À quelle vitesse est le collecteur d'ordures jscript? Rotation matricielle de trois.js

J'utilise ces deux fonctions afin de faire pivoter mes objets dans mes trois scènes

// Rotate an object around an arbitrary axis in object space function rotateAroundObjectAxis(object, axis, radians) { rotationMatrix = new THREE.Matrix4(); rotationMatrix.makeRotationAxis(axis.normalize(), radians); object.matrix.multiplySelf(rotationMatrix); // post-multiply object.rotation.getRotationFromMatrix(object.matrix, object.scale); delete rotationMatrix; } // Rotate an object around an arbitrary axis in world space function rotateAroundWorldAxis(object, axis, radians) { rotationMatrix = new THREE.Matrix4(); rotationMatrix.makeRotationAxis(axis.normalize(), radians); rotationMatrix.multiplySelf(object.matrix); // pre-multiply object.matrix = rotationMatrix; object.rotation.getRotationFromMatrix(object.matrix, object.scale); delete rotationMatrix; } 

Où rotationMatrix est une variable globale. Je suis inexpérimenté avec Javascript et développement d'applications Web, mais j'ai parlé à quelqu'un qui semblait me transmettre cela parce que parfois j'appelle ces fonctions une fois que je devrais être préoccupé par le fait qu'il crée de nouveaux objets chaque appel. Cela ne m'a pas encore posé de problèmes, mais est-ce que je craindrais que le collecteur d'ordures ne puisse pas continuer à durcir ? Je comprends que le mot-clé de suppression ici contrairement à C ++ supprime uniquement la référence. Est-ce que cela aide quand je l'appelle à la fin de chaque fonction? De plus, je peux faire autre chose que cela pour rendre cette fonction plus efficace afin qu'elle puisse être appelée autant de fois que possible sans ralentir les choses ou finalement faire naviguer trop de mémoire.

Après avoir joué un peu plus loin, j'ai beaucoup appris sur l'utilisation des Outils de développement Chrome. J'ai également réécrit ces fonctions pour être ce que je ressens pourrait être légèrement plus efficace. Je vais devoir voir comment cela se réduit, mais les outils de profil semblent montrer que ceux-ci sont un peu mieux sur la mémoire et le collecteur d'ordures.

La fonction de rotation dans l'espace mondial nécessite cependant une copie afin de ne pas créer une nouvelle matrice. En bref, si nous ne créons pas une nouvelle matrice de chaque appel, nous ne pouvons pas simplement copier la référence, nous devons copier la matrice. Fondamentalement, il s'agit de savoir si cette copie ou les frais généraux du collecteur d'ordures vont être plus coûteux.

 // Rotate an object around an arbitrary axis in object space var rotObjectMatrix= new THREE.Matrix4(); function rotateAroundObjectAxis(object, axis, radians) { rotObjectMatrix.makeRotationAxis(axis.normalize(), radians); object.matrix.multiplySelf(rotObjectMatrix); // post-multiply object.rotation.getRotationFromMatrix(object.matrix, object.scale); } var rotWorldMatrix = new THREE.Matrix4(); // Rotate an object around an arbitrary axis in world space function rotateAroundWorldAxis(object, axis, radians) { rotWorldMatrix.makeRotationAxis(axis.normalize(), radians); rotWorldMatrix.multiplySelf(object.matrix); // pre-multiply object.matrix.copy(rotWorldMatrix); object.rotation.getRotationFromMatrix(object.matrix, object.scale); } 

Je ne sais pas si ce sera mieux ou pas. J'ai pris ces captures d'écran. Celui-ci utilisait les fonctions d'origine et celui-ci est avec ces nouvelles fonctions . Il semble suggérer une performance légèrement meilleure avec les nouveaux. Je ne sais pas si je peux remarquer une différence.

EDIT: J'ai trouvé une fonction différente une fois que j'ai pris conscience de la fonction updateMatrix. Cela évite l'utilisation de la copie de la matrice complète. Voici la nouvelle fonction de rotation mondiale:

 /** Adds a rotation of rad to the obj's rotation about world's axis */ var rotWorldMatrix = new THREE.Matrix4(); function rotateWorldAxis(obj, axis, rad) { rotWorldMatrix.makeRotationAxis(axis.normalize(), rad); obj.updateMatrix(); rotWorldMatrix.multiplySelf(obj.matrix); // pre-multiply obj.rotation.getRotationFromMatrix(rotWorldMatrix, obj.scale); }