Как да оптимизираме 3D модели в TypeScript

Как да оптимизираме 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 за изход само с геометрия.


Вижте също

 Български