Как да оптимизираме 3D модели в TypeScript
Aspose.3D FOSS за TypeScript предоставя няколко стратегии за намаляване на размера на изходния файл и подобряване на пропускателната способност при обработка. Това ръководство обхваща избор на формат, вграждане на бинарни данни, конвейери в паметта и оптимизации на ниво Node.js.
Ръководство стъпка по стъпка
Стъпка 1: Изберете правилния изходен формат
GLB (binary glTF) произвежда най-компактния изход с добра поддръжка на инструменти. OBJ е текстово базиран и по-голям. STL е компактен за работни процеси, само с геометрия.
| Формат | Размер | Включва материали | Включва анимация | Най‑добра употреба |
|---|---|---|---|---|
| GLB | Малък | Да (вграден) | Да | Уеб, игри, общ обмен |
| glTF | Среден | Да (отделен) | Да | Разработка, инспекция |
| STL | Малък | Не | Не | 3D печат, само геометрия |
| 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: Използване на буферен 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: Пакетна обработка на файлове с работни нишки
За големи задачи за конвертиране разпределете работата върху работни нишки на 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 heap за много големи модели:
node --max-old-space-size=8192 convert.jsЧесто задавани въпроси
Кой е най‑компактният изходен формат?
GLB (binary glTF) с вградени активи осигурява най-компактния еднофайлов изход за сцени с материали и текстури. STL е по-компактен за съдържание само с геометрия.
Прилага ли @aspose/3d опростяване на мрежата или LOD?
Не. Библиотеката чете и записва изходната геометрия без да променя топологията на мрежата. Опростяването на мрежата (намаляване на върховете, генериране на LOD) не се поддържа.
Мога ли да премахна материалите, за да намаля размера на файла?
Задайте ObjSaveOptions.enableMaterials = false при запазване в OBJ. За glTF всички данни за материалите винаги се включват; използвайте STL за изход само с геометрия.