2013-07-26 58 views
0

我有一個問題困擾了我一段時間。使用THREE.JS對象的全局數組的Javascript內存管理

我正在使用three.js webgl庫來渲染具有許多紋理和網格的大場景。

這個問題不一定綁定到webgl,而是更多的javascript數組和內存管理。

我基本上是這樣:

var modelArray = []; 

var model = function(geometry,db_data){ 
    var tex = THREE.ImageUtils.loadTexture('texture.jpg'); 
    var mat = new THREE.MeshPhongMaterial({map:tex}) 
    this.mesh = new THREE.Mesh(geometry,mat); 
    this.db = db_data; 
    scene.add(this.mesh); 
}; 

function loadModels(model_array){ 
    for(i=0;i<geometry.length;i++){ 
    modelArray.push(new model(model_array[i]['geometry'],model_array[i]['db_info'])); 
    } 
} 

loadModels(); 

我是不是低效這裏?自從我將網格加載到場景和數組後,我基本上將使用的內存量加倍。或者數組中的模型(特別是model.mesh)對象是否只指向一個單獨的內存塊?

我應該只是創建一個mesh ID的數組並引用場景對象,或者可以將網格添加到場景和數組嗎?

在此先感謝,我希望我足夠清楚。

+1

您是爲了重構還是遇到性能問題或內存問題? – alex

+0

對於每個型號,我的內存使用量都呈指數級增長。不僅gpu內存,而且瀏覽器標籤內存只是看起來很高。這就是爲什麼。我仍然好奇地看到,如果將對象分配給數組是一種嚴重的內存命中,還是僅僅創建了一個非常大的(在這種情況下爲mesh)對象的引用。 – Hobbes

+0

我遇到了與通過刷新分配內存持久性相關的主題內存問題,我認爲這是不可能的。 – Hobbes

回答

1

,在跳出我的主要事情是這樣的:

var tex = THREE.ImageUtils.loadTexture('texture.jpg'); 
var mat = new THREE.MeshPhongMaterial({map:tex}) 

如果您在每次創建新模型時加載同樣的質地,能夠創造大量的開銷(它也可以是很慢)。我會在你的循環之外加載你需要的紋理和相應的材質。

modelArray是純model對象,每一個都具有一個指向相應mesh對象(以及對象db)的列表。 scene有一個指向同一個mesh對象的指針,所以你不會通過克隆網格來爆炸你的內存使用。

您的內存使用可能只是因爲您的網格幾何體佔用大量內存。嘗試一邊觀看內存使用情況一邊加載模型;也許你有一個意想不到的細節。

+0

我做緩存材料,幾何圖形和紋理(雖然紋理我真的希望我可以重複使用可變重複設置的紋理,但不能= [)。我很高興聽到在這種情況下創建了一個指針=]我想這就是我要做的,逐個加載對象,看看是什麼造成的。感謝您的意見。 – Hobbes