メモリリークに関するトピックがたくさんあることは知っていますが、解決策を試しましたが、まだ機能しません。
私はこの例に取り組んでいます
ので、私は持っています
materialPano=new THREE.MeshFaceMaterial( materials );
materialPano.needsUpdate=true;
mesh = new THREE.Mesh( new THREE.CubeGeometry( 400, 400, 400, 7, 7, 7 ), materialPano );
ボタンをクリックしたときにテクスチャを変更する機能を追加しています。問題は、以前のテクスチャが削除されず、新しいテクスチャごとに使用メモリが増加することです。
したがって、ボタンをクリックすると、次の機能が実行されます。
materials = [loadTexture(myNewTexture1 ), loadTexture( myNewTexture2),loadTexture( myNewTexture3 ),loadTexture( myNewTexture4 ),loadTexture( myNewTexture5), loadTexture( myNewTexture6)];
myNewTexureK
ボタンで変化する新しい画像ファイルです。そしてメッシュ素材をアップデート。
materialPano.materials=materials;
mesh.material=materialPano;
問題は、以前のテクスチャを削除する方法がわからないことです。私はそのような多くのことを試しました:
for(var k=0;k<materials.length;k++){
materials[k].deallocate();
scene.remove(materials[k]);
renderer.deallocateTexture(materials[k]);
renderer.deallocateMaterial(materials[k]);
renderer.deallocateObject(materials[k]);
delete materials[k];
materials[k]=null;
}
renderer.deallocateMaterial(materials);
renderer.deallocateObject(materials);
delete materials;
materials=null;
そして、ここで私はmaterials=[loadTexture(newTexture,...)];
そして、私はそのloadTexture
ような関数を変更しました:
function loadTexture( path ) {
var texture = new THREE.Texture( texture_placeholder );
var material = new THREE.MeshBasicMaterial( { map: texture, overdraw: true } );
var image = new Image();
image.onload = function () {
texture.needsUpdate = true;
material.map.image = this;
render();
};
image.src = path;
texture.deallocate();//new line
renderer.deallocateTexture( texture );//new line
return material;
}
しかし、それは何も削除しません!そして、例を変更せずに、ページを更新するとメモリも増加することに気付きました。例でメモリリークが発生していますか?
メモリリークを避けるためにテクスチャを本当に削除する方法はありますか?
どうもありがとう!
誰も解決策を持っていませんか?:(メッセージを編集して、より正確になるようにします。
var mesh;
function loadTexture( path ) {
var texture = new THREE.Texture( texture_placeholder );
var material = new THREE.MeshBasicMaterial( { map: texture, overdraw: true } );
var image = new Image();
image.onload = function () {
texture.needsUpdate = true;
material.map.image = this;
render();
};
image.src = path;
texture.deallocate();
renderer.deallocateTexture( texture );
return material;
}
function init(){
//some initializations, create scene, webgl renderer, ...
var materiales = [
loadTexture( '1.jpg' ),
loadTexture( '2.jpg'),
loadTexture( '3.jpg' ),
loadTexture( '4.jpg' ),
loadTexture( '5.jpg'),
loadTexture( '6.jpg' )
];
mesh = new THREE.Mesh( new THREE.CubeGeometry( 400, 400, 400, 7, 7, 7 ),new THREE.MeshFaceMaterial( materiales ) );
scene.add( mesh );
}
ボタンをクリックすると、次のようになります。
updateTexture(){
var materiales = [
loadTexture( 'new1.jpg' ),
loadTexture( 'new2.jpg'),
loadTexture( 'new3.jpg' ),
loadTexture( 'new4.jpg' ),
loadTexture( 'new5.jpg'),
loadTexture( 'new6.jpg' )
];
mesh.material=new THREE.MeshFaceMaterial( materiales );
}
問題は、クリックするたびにメモリが増加することです。そのコードだけで、通常、以前の mesh.material を削除するものは何もありません。しかし、私は次のような多くのことを試しました:
mesh.deallocate(mesh.material);
mesh.geometry.deallocate(mesh.material);
scene.deallocate(mesh.material);
renderer.deallocateMaterial(mesh.material);
renderer.deallocateTexture(mesh.material);
renderer.deallocateObject(mesh.material);
scene.remove(mesh.material);
そして、メモリはまだ増加しています。私は Firefox v 17.0.1 で作業していると正確に言います。リークは Chrome でも表示されます。