Three.js предоставляет удобные механизмы для работы с 3D-графикой в браузере, но при работе с крупными сценами или высокополигональными моделями критически важно оптимизировать передачу и хранение геометрии. Одним из ключевых инструментов для этой задачи является DRACOLoader — загрузчик и декомпрессор геометрии, сжатой с помощью библиотеки Google Draco.
Draco — это формат сжатия 3D-геометрии, предназначенный для уменьшения объема данных при сохранении точности модели. Основные особенности:
Draco идеально подходит для веб-приложений, где задержка сети и объем передаваемых данных критичны.
Для работы с DRACOLoader требуется подключение скрипта и указание пути к библиотеке декодера Draco:
import * as THREE fr om 'three';
import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js';
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
// Создание загрузчика Draco
const dracoLoader = new DRACOLoader();
dracoLoader.setDecoderPath('/draco/'); // путь к декодеру (draco_decoder.js, draco_wasm_wrapper.js)
// Создание загрузчика glTF с поддержкой Draco
const loader = new GLTFLoader();
loader.setDRACOLoader(dracoLoader);
Ключевой момент: setDecoderPath должен
указывать на директорию, где находятся файлы декодера (.js
и .wasm). Использование WebAssembly обеспечивает наибольшую
производительность.
Основные методы и свойства:
setDecoderPath(path: string) — путь к библиотеке
декодера.setDecoderConfig(config: object) — конфигурация
декодера, например type: 'js' | 'wasm'.setWorkerLimit(lim it: number) — количество веб-воркеров
для параллельной декомпрессии (по умолчанию 2–4).preload() — предварительная загрузка декодера для
ускорения последующей декомпрессии моделей.Пример настройки воркеров:
dracoLoader.setWorkerLimit(4);
dracoLoader.preload();
Это важно для сцен с множеством моделей — позволяет декомпрессировать несколько объектов параллельно, минимизируя задержку рендеринга.
После настройки DRACOLoader его используют вместе с GLTFLoader или другими загрузчиками:
loader.load('models/scene_draco.glb', function(gltf) {
scene.add(gltf.scene);
}, undefined, function(error) {
console.error('Ошибка загрузки модели:', error);
});
Пошаговый процесс:
Результатом является полноценная геометрия, готовая к рендерингу с материалами, текстурами и анимациями.
.wasm декодера быстрее и требует меньше памяти.
Настоятельно рекомендуется для больших сцен.preload(): позволяет
загрузить декодер заранее, снижая задержку при первой загрузке
модели.setWorkerLimit позволяет оптимизировать многопоточные
процессы на клиенте.Three.js рекомендует сжимать модели в glTF с помощью Draco. При экспорте из Blender или других 3D-редакторов необходимо:
При этом DRACOLoader автоматически распознает, что геометрия сжата, и выполнит декомпрессию без дополнительной ручной настройки.
DRACOLoader обеспечивает баланс между качеством геометрии и эффективностью передачи данных. Он полностью интегрируется в экосистему Three.js и позволяет работать с высокополигональными моделями в браузере без заметных задержек.