2016-10-24 2 views
1

私は3つのjsオブジェクトを作成し、いくつかの子供を追加しました。子の長さを0に変更したところ、オブジェクトが画面から消えました。オブジェクトによって画面とメモリが完全に削除されるのでしょうか?より多くの球3子子の長さ

のために繰り返さ手順上記

var balls = new THREE.Object3D(); // parent 
作成する子供のための

var geometry = new THREE.SphereGeometry(5, 32, 32); 
var material = new THREE.MeshPhongMaterial({color: 0x0f0ff0, shininess: 50, transparent: true, opacity: 1}); 
var sphere = new THREE.Mesh(geometry, material); 
sphere.position.x = scale('some random value'); 
sphere.position.y = scale('some random value'); 
balls.add(sphere); 

、コンソールに、私はこのシーンからすべての球を削除

balls.children = []; 

を書きました。それはメモリから球体もすべて削除しますか?

+3

http://stackoverflow.com/a/8467563/3264799ガベージコレクションが必要なので、「正しい」ことをしています。しかし、Three.js-wayは 'scene.remove(child)'メソッドを通して各要素をシーンから削除することです。とにかく要素の作成と制御を担当するので、Three.jsがそれを望むようにするのは良い方法です。時々ライブラリは混乱するかもしれません、それらが何かについての情報を含む私的な変数を持っていて、それが突然削除されると、それはシステムを破壊します。 – ascx

答えて

1

はい、配列を持ち、array.length = 0;を設定すると、配列のすべての要素が削除されます。 array.length = 2と入力すると、最初の2つの要素以外のすべての要素が削除されます。 Javascriptには同様のことをするslice()という機能があります。

0

子を削除する正しい方法は、親からremove(子)を呼び出してから、子供のマテリアルとジオメトリに対してdispose()を使用することです。あなたのコードで

var balls = new THREE.Object3D(); // parent 

var geometry = new THREE.SphereGeometry(5, 32, 32); 
var material = new THREE.MeshPhongMaterial({color: 0x0f0ff0, shininess: 50, transparent: true, opacity: 1}); 
var sphere = new THREE.Mesh(geometry, material); 
sphere.position.x = scale('some random value'); 
sphere.position.y = scale('some random value'); 
balls.add(sphere); 

// Do some work 

balls.remove(sphere); 
geometry.dispose(); 
material.dispose(); 

は、それはもう他のメッシュで使用されていないだけで材料/ジオメトリを処分してください。 削除(オブジェクト、...)THREE.Object3Dから

"は、このオブジェクトの子としてオブジェクトを削除するオブジェクトの任意の数を除去することができます。" にdispose()THREE.Geometryから

は、「それはメモリリークが発生する可能性がありますので、あなたがジオメトリを削除するときに、このメソッドを呼び出すことを忘れないでください。」

にdispose()THREE.Materialから: "これは、材料を配置する材料のテクスチャが配置され得ることはありませんこれらのニーズはテクスチャで配置されるように。。"

texturesを使用する場合は、これらも処分する必要があります。

(THREE.js r85)。

関連する問題