Hur man optimerar 3D-modeller i TypeScript
Aspose.3D FOSS för TypeScript erbjuder flera strategier för att minska utdatafilens storlek och förbättra bearbetningsgenomströmning. Denna guide täcker formatval, binär inbäddning, minnesbaserade pipelines och optimeringar på Node.js-nivå.
Steg-för-steg-guide
Steg 1: Välj rätt utdataformat
GLB (binär glTF) ger den mest kompakta utdata med bra verktygsstöd. OBJ är textbaserat och större. STL är kompakt för arbetsflöden som bara innehåller geometri.
| Format | Storlek | Inkluderar material | Inkluderar animation | Bästa användning |
|---|---|---|---|---|
| GLB | Liten | Ja (inbäddad) | Ja | Webb, spel, allmän utbyte |
| glTF | Mellan | Ja (separerad) | Ja | Utveckling, inspektion |
| STL | Liten | Nej | Nej | 3D printing, geometry-only |
| OBJ | Stor | Separat .mtl | Nej | Äldre verktyg, bred kompatibilitet |
| FBX | Medium | Nej* | Nej* | Importör/exportör finns men är inte kopplad till automatisk detektering |
| 3MF | Liten | Ja | Nej | Modern 3D-utskrift |
Steg 2: Exportera till binär GLB
När du sparar till GLB, ange GltfSaveOptions.binaryMode = true för att producera en enda självständig binär fil. Detta undviker den separata .bin sidecar-filen och krävs för många 3D-visare:
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');Steg 3: Använd Buffer I/O för minnesbaserade pipelines
När du bearbetar filer i en webbtjänst, använd openFromBuffer och saveToBuffer för att undvika att skriva till filsystemet:
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');
}Steg 4: Batch‑processa filer med worker‑trådar
För stora konverteringsjobb, distribuera arbetet över Node.js worker‑trådar för att utnyttja flera CPU‑kärnor:
// 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}`));
}Steg 5: Övervaka minnet för stora modeller
För filer över 50 MB, övervaka heap‑användning och bearbeta filer sekventiellt om minnet är begränsat:
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');Öka Node.js‑heapen för mycket stora modeller:
node --max-old-space-size=8192 convert.jsVanliga frågor
Vilket är det mest kompakta utdataformatet?
GLB (binär glTF) med inbäddade resurser ger den mest kompakta enfiliga utdata för scener med material och texturer. STL är mer kompakt för innehåll som bara består av geometri.
Applicerar @aspose/3d mesh‑förenkling eller LOD?
Nej. Biblioteket läser och skriver källgeometrin utan att ändra mesh‑topologin. Mesh‑förenkling (vertex‑reduktion, LOD‑generering) stöds inte.
Kan jag ta bort material för att minska filstorleken?
Ställ in ObjSaveOptions.enableMaterials = false när du sparar till OBJ. För glTF inkluderas alltid all materialdata; använd STL för endast geometriutdata.