Как да оптимизираме 3D модели в TypeScript
Aspose.3D FOSS за TypeScript предоставя няколко стратегии за намаляване на размера на изходния файл и подобряване на пропускателната способност на обработката. Това ръководство обхваща избор на формат, вграждане на бинарни данни, конвейери в паметта и оптимизации на ниво Node.js.
Ръководство стъпка по стъпка
Стъпка 1: Изберете правилния изходен формат
GLB (бинарен glTF) генерира най-компактен изход с добра поддръжка от инструменти. OBJ е текстов и по-голям. STL е компактен за работни потоци, съдържащи само геометрия.
| Формат | Размер | Включва материали | Включва анимация | Най-добра употреба |
|---|---|---|---|---|
| GLB | Малък | Да (вградено) | Да | Уеб, игри, общ обмен |
| glTF | Medium | Да (отделно) | Да | Разработка, инспекция |
| STL | Малък | Не | Не | 3D printing, geometry-only |
| OBJ | Голям | Отделен .mtl | Не | Наследени инструменти, широка съвместимост |
| FBX | Среден | Не* | Не* | Импортер/експортер съществуват, но не са включени в автоматичното откриване |
| 3MF | Малък | Да | Не | Съвременно 3D печатане |
Стъпка 2: Експортиране в бинарен GLB
При запазване в GLB, задайте GltfSaveOptions.binaryMode = true за да създадете един самостоятелен двоичен файл. Това избягва отделния .bin sidecar и е необходимо за много 3D визуализатори:
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
import { GltfSaveOptions } from '@aspose/3d/formats/gltf';
const scene = new Scene();
scene.open('complex-model.obj', new ObjLoadOptions());
const opts = new GltfSaveOptions();
opts.binaryMode = true;
scene.save('optimized.glb', opts);
console.log('Saved compact binary GLB');Стъпка 3: Използвайте Buffer I/O за конвейери в паметта
Когато обработвате файлове в уеб услуга, използвайте openFromBuffer и saveToBuffer за да избегнете записване във файловата система:
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
function convertInMemory(inputBuffer: Buffer): Buffer {
const scene = new Scene();
scene.openFromBuffer(inputBuffer, new ObjLoadOptions());
return scene.saveToBuffer('glb');
}Стъпка 4: Пакетна обработка на файлове с Worker Threads
За големи задачи по конвертиране разпределете работата между worker threads в Node.js, за да използвате множество CPU ядра:
// worker.ts
import { workerData, parentPort } from 'worker_threads';
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const { inputPath, outputPath } = workerData;
const scene = new Scene();
scene.open(inputPath, new ObjLoadOptions());
scene.save(outputPath);
parentPort?.postMessage({ done: true, output: outputPath });// main.ts: dispatch files to workers
import { Worker } from 'worker_threads';
import * as fs from 'fs';
import * as path from 'path';
const files = fs.readdirSync('./input').filter(f => f.endsWith('.obj'));
for (const file of files) {
const inputPath = path.join('./input', file);
const outputPath = path.join('./output', file.replace('.obj', '.glb'));
const worker = new Worker('./dist/worker.js', {
workerData: { inputPath, outputPath }
});
worker.on('message', msg => console.log(`Converted: ${msg.output}`));
worker.on('error', err => console.error(`Error: ${err}`));
}Стъпка 5: Наблюдавайте паметта за големи модели
За файлове над 50 MB наблюдавайте използването на купчината и обработвайте файловете последователно, ако паметта е ограничена:
function logMemory(label: string) {
const used = process.memoryUsage();
console.log(`[${label}] heapUsed: ${Math.round(used.heapUsed / 1024 / 1024)} MB`);
}
logMemory('before load');
const scene = new Scene();
scene.open('large-model.obj');
logMemory('after load');
scene.save('output.glb');
logMemory('after save');Увеличете купчината на Node.js за много големи модели:
node --max-old-space-size=8192 convert.jsЧесто задавани въпроси
Кой е най-компактният изходен формат?
GLB (бинарен glTF) с вградени активи произвежда най-компактния еднофайлов изход за сцени с материали и текстури. STL е по-компактен за съдържание, съдържащо само геометрия.
Прилага ли @aspose/3d опростяване на мрежата или LOD?
Не. Библиотеката чете и записва изходната геометрия без да променя топологията на мрежата. Опростяването на мрежата (намаляване на върховете, генериране на LOD) не се поддържа.
Мога ли да премахна материалите, за да намаля размера на файла?
Задайте ObjSaveOptions.enableMaterials = false при запазване в OBJ. За glTF, всички данни за материалите винаги се включват; използвайте STL за изход само с геометрия.