Повторное использование сеток three.js (для воксельных миров)

В настоящее время я впервые изучаю three.js и 3D-графику и пытаюсь создать воксельный движок (например, Minecraft, Infiniminer). Я обнаружил, что мой скрипт занимает много памяти, но у меня есть подозрения почему - каждый блок, который я создаю, использует новый объект Mesh, даже если некоторые из блоков выглядят одинаково.

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

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


person Sp3000    schedule 12.09.2013    source источник
comment
Пожалуйста, проверьте threejsfundamentals.org/threejs/lessons/.   -  person Pranavka    schedule 27.01.2020


Ответы (2)


Я считаю, что они выполняют то, что вы просите в элементах управления трекболом three.js. Пройдите по этой ссылке

Если у вас возникли проблемы с просмотром исходного кода, используйте сочетание клавиш cntrl + u (Windows)

person Chris Hawkes    schedule 12.09.2013
comment
Судя по строке 92, я думаю, что каждая пирамида - это отдельный объект Mesh... (new THREE.Mesh( геометрия, материал)) - person Sp3000; 12.09.2013
comment
да, вы правы, кажется, они создают 500 треугольников в этом заявлении. :( - person Chris Hawkes; 12.09.2013

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

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

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

person Darryl_Lehmann    schedule 12.09.2013
comment
Спасибо за ответ - я взглянул на clone(), но не думаю, что создание новых объектов сработает. Мой прогресс в настоящее время здесь - большая часть соответствующего кода находится в world.js и блоках .js. В настоящее время я объединяю некоторую геометрию своих блоков, но, поскольку игрок должен иметь возможность редактировать среду, сами отдельные блоки также сохраняются (отсюда и соображения памяти). - person Sp3000; 13.09.2013