Javascript jscript垃圾收集器的速度有多快?3.js矩阵旋转

Javascript jscript垃圾收集器的速度有多快?3.js矩阵旋转,javascript,memory-management,graphics,garbage-collection,three.js,Javascript,Memory Management,Graphics,Garbage Collection,Three.js,我使用这两个函数来旋转three.js场景中的对象 // Rotate an object around an arbitrary axis in object space function rotateAroundObjectAxis(object, axis, radians) { rotationMatrix = new THREE.Matrix4(); rotationMatrix.makeRotationAxis(axis.normali

我使用这两个函数来旋转three.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应用程序开发没有经验,但我和一位似乎向我传达了这样一个信息的人交谈过,因为有时我一帧调用一次这些函数,我应该关注这样一个事实,即每次调用都会创建新的对象。到目前为止,这还没有给我带来问题,但是我是否应该担心垃圾收集器最终将无法跟上?我理解,这里的删除关键字不同于C++,只删除引用。strong>当我在每个函数结束时调用它时,这有帮助吗?还有除了此之外,我还可以做些什么来提高这个函数的效率,以便尽可能多地调用它,而不会减慢速度或最终使浏览器占用太多内存。

在摆弄这个函数之后更进一步,我学到了很多关于如何使用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);
}

删除操作没有帮助。即使它确实执行了您认为它执行的操作,它也只会帮助您稍早地释放单个矩阵对象。不幸的是,它甚至没有做到这一点:
delete obj.attr
确实删除了一个引用,但是
delete var
是无效的(被一些浏览器接受,并且可能会)。看见实际上,因为它是一个全局变量(顺便说一句,为什么),它可能会工作。但是,这同样没有帮助。尝试使用chrome开发工具进行评测我会花时间尝试完成一些评测,但这就是问题所在。目前,它在我的演示中运行得非常出色。但它们都是独立的而不是过于复杂的演示。我只是想知道这是否可以在游戏中使用,或者旋转是否必须以其他方式实现,而无需在每帧中实例化新的旋转矩阵。我使用Chrome开发者工具中的录制时间线功能进行了一些评测。这似乎表明我的记忆在3.3MB和5.2MB之间波动?当我开始使用矩阵旋转旋转立方体时,它似乎没有任何效果。如果我在TaskManager中查看,我的tabs chrome线程似乎每秒大约增加50K的内存使用量。不确定这是否糟糕。我对您的另一个答案发表了评论,您是否可以重用新的THREE.Matrix4,而不是每次都在函数中创建?