jscript 垃圾收集器的速度有多快?三.js矩阵旋转
How fast is the jscript garbage collector? Three.js Matrix Rotations
我正在使用这两个函数来旋转我的三个.js场景中
的对象 // 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;
}
其中 rotationMatrix 是一个全局变量。我对Javascript和Web应用程序开发没有经验,但我与一个似乎向我传达的信息的人交谈过,因为有时我调用这些函数一次,所以我应该关注它每次调用都会创建新对象的事实。到目前为止,这还没有给我带来问题,但我应该担心垃圾收集器最终无法跟上吗?我知道这里的 delete 关键字与 C++ 中的关键字不同,它只会删除引用。当我在每个函数结束时调用它时,这是否有帮助?除此之外,我还可以做些什么来使这个函数更有效率,以便可以尽可能多地调用它,而不会减慢速度或最终使浏览器占用太多内存。
在进一步摆弄之后,我学到了很多关于如何使用Chrome开发人员工具的知识。此外,我还重写了这些函数,使其我认为可以稍微更有效率。我将不得不看看它是如何扩展的,但分析工具似乎表明这些在内存和垃圾收集器上要好一些。
然而,在世界空间中旋转的功能需要一个副本,以便不创建新的矩阵。简而言之,如果我们每次调用都不创建一个新矩阵,我们不能简单地复制引用,我们必须复制矩阵。基本上,这取决于此副本或垃圾收集器开销是否会更昂贵。
// 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);
}
我不确定这是否会更好。我截了这些截图。这个使用的是原始函数,这个是使用这些新功能。似乎表明新的性能略好。我不确定我是否能注意到差异。
编辑:一旦我意识到updateMatrix函数,我想出了一个不同的函数。这样可以避免使用复制整个矩阵。这是新的世界旋转功能:
/** 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);
}
相关文章:
- 使用D3.js旋转外部SVG文件
- Kinetic.js旋转组对象的新子对象具有不正确的偏移
- JS旋转函数输出奇怪的X值
- 版本70关于TrackballControls.js旋转
- 画架js旋转容器退出屏幕
- 在印象中面临问题.js旋转木马
- CSS/JS/HTML:JS 旋转整页的函数
- 三.js旋转模型的一部分
- 如何使Bootstrap js旋转木马在页面加载后立即自动循环
- 正在寻找响应灵敏的js旋转木马
- 使用Raphael.js旋转图像
- (立方体)用三个.js旋转
- Boostrap.js旋转木马不工作
- 三.js旋转矢量和屏幕边缘检测
- 如何使用SVG.js旋转梯度
- 如何改变THREE.js旋转地球仪从画布到WebGL
- Hammer.js旋转木马开始窗格
- JS旋转木马停止时,鼠标停留
- js旋转,缩放不发生围绕对象的中心轴
- js旋转除了摄像机以外的所有东西