2013-07-26 3 views
0

У меня есть вопрос, который беспокоил меня в течение некоторого времени.Управление памятью с использованием глобальных массивов объектов THREE.JS

Я использую библиотеку tr.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) в массиве просто указывает на единичный блок памяти?

Должен ли я просто создать массив идентификаторов сетки и ссылаться на объекты сцены, или это нормально, чтобы добавить меш в сцену и массив?

Спасибо заранее, и я надеюсь, что я был достаточно ясен.

+1

Вы реорганизованы ради этого или столкнулись с проблемой производительности или памяти? – alex

+0

Использование моей памяти для каждой модели экспоненциально выше. Не только память gpu, но и память вкладок браузера, которая просто кажется высокой. Вот почему. Мне все еще интересно узнать, является ли назначение объектов массиву серьезным ударом памяти или просто создает ссылку на объект (в данном случае меш), который очень велик. – 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

Смежные вопросы