0

three.jsシーンでオブジェクトを回転させるために、これら2つの関数を使用しています

    // 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 ++とは異なり、参照のみを削除することを理解しています。これは、各関数の最後で呼び出すときに役立ちますか?また、この機能をより効率的にするために、それ以外にできることはありますか?速度を落としたり、最終的にブラウザがメモリを大量に消費したりすることなく、可能な限り何度も呼び出すことができるようにします。

4

1 に答える 1

0

これをもう少しいじった後、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);
}
于 2012-06-28T01:34:33.807 に答える