2013-09-12 4 views
1

Я в настоящее время изучаю трехмерную и трехмерную графику в первый раз и пытаюсь создать движок воксела (думаю, Minecraft, Infiniminer). Я обнаружил, что мой сценарий занимает много памяти, но у меня есть подозрения, почему: каждый блок, который я создаю, использует новый объект Mesh, даже если некоторые из блоков выглядят одинаково.Reusing three.js meshes (for voxel worlds)

Я спросил некоторых людей, которых я знал, знают ли они о более эффективном с точки зрения памяти способе сделать это - они предложили создать один Mesh для каждого типа блока и использовать матрицы для преобразования Mesh для каждого экземпляра блока (они " знакомы с OpenGL, но не так много three.js). Имеет ли three.js что-то вроде этого? Если да, как бы вы это сделали, а если нет, есть ли другие альтернативы?

(До сих пор я понимаю, что каждый элемент, который вы хотите визуализировать, должен находиться в графе сцены, поэтому, даже если несколько блоков выглядят одинаково, вам нужно добавить несколько копий блока (с разными x, y, z coords) на диаграмме. Возможно, я ошибаюсь.)

ответ

1

Я считаю, что они выполняют то, что вы просите в элементах управления трекболом three.js. Check out this link here

Если у вас есть проблемы с просмотром источника использовать сочетание клавиш Управлен + U (окна)

+0

По внешнему виду линии 92 Я думаю, что каждая пирамида - это свой собственный объект Mesh, хотя ... («новый». THREE.Mesh (геометрия, материал)) – Sp3000

+0

да, вы правы, похоже, что они создают 500 треугольников в этом заявлении. :( –

1

Добрый день, просто чтобы уточнить. Three.js является оболочкой для API WebGL, которая является подмножеством OpenGL ES 2.0 без расширений. Поэтому знания, связанные с OpenGL, применимы здесь к точке, вам просто нужно работать от максимума до минимума через источник Three.js.

Теперь идея иметь базовый набор объектов, а затем клонировать и перемещать их звучит. Существует функция clone(), по сути, это создает для вас совершенно новый объект так же, как если бы вы создавали новые сетки, но немного более доступны во время выполнения.

Если бы я мог предложить несколько советов, то увидеть какой-то код мог бы помочь нам определить более точную оптимизацию для вашего случая использования. Возможно, у вас есть некоторые вызовы, которые могут быть/должны быть перенесены на фазу init, возможно, память протекает в другом месте? В качестве альтернативы вы могли бы рассмотреть возможность слияния некоторой геометрии, если она останется статической, либо в коде, либо в программе 3D-моделирования. Это не уменьшит значимость полигонала, но, безусловно, поможет упростить вашу сцену.

+0

Спасибо за ответ - я посмотрел на clone(), но я не думаю, что создание новых объектов будет работать. Мой прогресс в настоящее время [здесь] (http://parityofzero.com/webgl/infinite_field_130913/infinite_field. html) - большая часть соответствующего кода находится в world.js и blocks.js. В настоящее время я объединяю часть геометрии блока, но поскольку плеер должен иметь возможность редактировать среду, отдельные блоки сами хранятся (следовательно, соображения памяти). – Sp3000