2012-12-17 42 views
12

Tôi có một cảnh lớn với nhiều Mesh và MorphAnimMesh. Tôi muốn giải phóng bộ nhớ khi các mắt lưới bị loại bỏ. Nếu tôi biết đây là cách tốt nhất để làm:Quản lý bộ nhớ ba js

for (var i = scene.children.length - 1; i >= 0 ; i --) { 
    var obj = scene.children[i]; 
    scene.remove(obj); 
    obj.deallocate(); 
    obj.geometry.deallocate(); 
    obj.material.deallocate(); 
    obj.material.map.deallocate(); 
} 

nếu tôi kiểm tra việc sử dụng bộ nhớ tại trình quản lý tác vụ sau này, không có gì thay đổi. (cố gắng chờ một vài phút cho GC nhưng không có gì.) Ảnh chụp bộ nhớ Google Chrome hiển thị các đối tượng vẫn còn đó. morphTargets trong BA.Geometry @ 1862203, v.v.

Cố gắng đặt obj thành rỗng, nhưng vẫn không giảm bộ nhớ.

Bất kỳ ý tưởng nào tôi đang làm sai?

Trò chơi có cấp độ và người chơi có thể thay đổi từ trò chơi này sang người khác. Sau một vài thay đổi, việc sử dụng bộ nhớ tăng lên rất cao. Đó là lý do tại sao tôi muốn loại bỏ tất cả các đối tượng từ bộ nhớ trước khi thay đổi cấp độ.

Trả lời

-2

Quản lý bộ nhớ JavaScript được kiểm soát hoàn toàn bởi trình duyệt. Bạn không thể ép buộc GC chạy (và bạn không thể thực hiện được vì nó được tối ưu hóa khá tốt).

GC sẽ chỉ hủy các đối tượng không còn tham chiếu đến chúng; thiết lập obj = null; không thực sự phá hủy đối tượng, thay vì nó chỉ xóa tham chiếu đến đối tượng.

Nếu bạn có các tài liệu tham khảo khác vẫn nằm xung quanh trong các bao đóng đang mở (hoặc đính kèm DOM), trình duyệt sẽ giữ cho đối tượng đó còn sống vì mục đích của chúng.

Bạn nên đọc perfection kills -- understanding delete, và nếu bạn đang sử dụng chrome, điều này có vẻ giống như một công cụ tốt: leak finder for javascript

10

Nhiều khả năng, bạn cần phải thêm một số hoặc tất cả các nội dung sau:

geometry.dispose(); 
material.dispose(); 
texture.dispose(); 

Kiểm tra các ví dụ:

http://mrdoob.github.com/three.js/examples/webgl_test_memory.html

http://mrdoob.github.com/three.js/examples/webgl_test_memory2.html

three.js r.60

+0

Cố gắng này, nhưng không có gì thay đổi. Nếu tôi có một heap snapshot trong chrome các đối tượng, mảng (ví dụ: morphTargets trong BA.Geometry @ 1862203) vẫn còn đó và việc sử dụng bộ nhớ là như nhau. – user974250

+0

Có lẽ bạn đang giữ một ref cho lưới, kết cấu hoặc tài liệu ở đâu đó? – Neil

+0

điều về những ví dụ này là chúng không liên quan đến kết cấu –

-1

Tôi đã thử tất cả các phương pháp vứt bỏ và deallocate nhưng không có gì hiệu quả.

Sau đó, tôi đã làm như sau cho ứng dụng ionic của tôi đang sử dụng trình kết xuất webgl để hiển thị hình ảnh 360 độ.

this.renderer = new THREE.WebGLRenderer({ antialias: true }); 
RicohView.prototype.stopRendering = function() { 
    this.canRender = false; 
    this.renderer.forceContextLoss(); 
    this.renderer.dispose(); 
    console.log('renderer disposed'); 
    cancelAnimationFrame(this.requestId); 
} 

requestId là một cái gì đó mà có thể được chụp từ

this.requestId = requestAnimationFrame(render); 
Các vấn đề liên quan