Kako optimizirati 3D modele u TypeScriptu
Aspose.3D FOSS for TypeScript pruža nekoliko strategija za smanjenje veličine izlazne datoteke i poboljšanje propusnosti obrade. Ovaj vodič pokriva odabir formata, binarno ugrađivanje, cjevovode u memoriji i optimizacije na razini Node.js-a.
Vodič korak po korak
Korak 1: Odaberite pravi izlazni format
GLB (binarni glTF) daje najkompaktniji izlaz uz dobru podršku alata. OBJ je tekstualni i veći. STL je kompaktniji za radne tokove koji sadrže samo geometriju.
| Format | Veličina | Uključuje materijale | Uključuje animaciju | Najbolja upotreba |
|---|---|---|---|---|
| GLB | Malo | Da (ugrađeno) | Da | Web, igre, opća razmjena |
| glTF | Srednje | Da (odvojeno) | Da | Razvoj, inspekcija |
| STL | Malo | Ne | Ne | 3D printing, geometry-only |
| OBJ | Veliko | Odvojeni .mtl | Ne | Naslijeđeni alati, široka kompatibilnost |
| FBX | Srednje | Ne* | Ne* | Uvoznik/izvoznik postoji, ali nije povezan s automatskim otkrivanjem |
| 3MF | Malo | Da | Ne | Moderno 3D ispisivanje |
Korak 2: Izvezite u binarni GLB
Pri spremanju u GLB, postavite GltfSaveOptions.binaryMode = true da biste proizveli jednu samostalnu binarnu datoteku. To izbjegava odvojeni .bin sidecar i potrebno je za mnoge 3D preglednike:
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');Korak 3: Koristite Buffer I/O za cjevovode u memoriji
Pri obradi datoteka u web usluzi, koristite openFromBuffer i saveToBuffer da biste izbjegli pisanje na datotečni sustav:
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('output.glb');
}Korak 4: Grupno obrađujte datoteke s radnim nitima
Za velike zadatke konverzije, raspodijelite posao preko Node.js radnih niti kako biste iskoristili više CPU jezgri:
// 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}`));
}Korak 5: Nadgledajte memoriju za velike modele
Za datoteke veće od 50 MB, nadgledajte korištenje hrpe i obrađujte datoteke sekvencijalno ako je memorija ograničena:
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');Povećajte Node.js hrpu za vrlo velike modele:
node --max-old-space-size=8192 convert.jsČesto postavljana pitanja
Koji je najkompaktniji izlazni format?
GLB (binarni glTF) s ugrađenim sredstvima daje najkompaktniji jednofajlni izlaz za scene s materijalima i teksturama. STL je kompaktniji za sadržaj koji sadrži samo geometriju.
Primjenjuje li @aspose/3d pojednostavljenje mreže ili LOD?
Ne. Biblioteka čita i zapisuje izvornu geometriju bez izmjene topologije mreže. Pojednostavljenje mreže (smanjenje vrhova, generiranje LOD‑a) nije podržano.
Mogu li ukloniti materijale kako bi smanjio veličinu datoteke?
Postavi ObjSaveOptions.enableMaterials = false prilikom spremanja u OBJ. Za glTF, svi podaci o materijalu su uvijek uključeni; koristite STL za isključivo geometrijski izlaz.