Hvordan optimalisere 3D-modeller i TypeScript

Hvordan optimalisere 3D-modeller i TypeScript

Aspose.3D FOSS for TypeScript tilbyr flere strategier for å redusere utdatafilstørrelse og forbedre behandlingsgjennomstrømning. Denne guiden dekker formatvalg, binær innbygging, minnebaserte pipelines og optimaliseringer på Node.js-nivå.

Steg-for-steg guide

Steg 1: Velg riktig utdataformat

GLB (binær glTF) gir den mest kompakte utdataen med god verktøystøtte. OBJ er tekstbasert og større. STL er kompakt for kun‑geometri arbeidsflyter.

FormatStørrelseInkluderer materialerInkluderer animasjonBeste bruk
GLBLitenJa (innebygd)JaNett, spill, generell utveksling
glTFMiddelsJa (separat)JaUtvikling, inspeksjon
STLLitenNeiNei3D printing, geometry-only
OBJStorSeparat .mtlNeiEldre verktøy, bred kompatibilitet
FBXMiddelsNei*Nei*Importer/exporter finnes, men er ikke koblet til automatisk gjenkjenning
3MFLitenJaNeiModerne 3D-utskrift

Steg 2: Eksporter til binær GLB

Når du lagrer til GLB, sett GltfSaveOptions.binaryMode = true for å produsere en enkelt selvstendig binærfil. Dette unngår den separate .bin sidecar-filen og er påkrevd for mange 3D-visere:

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: Bruk Buffer I/O for minnebaserte pipelines

Når du behandler filer i en nettjeneste, bruk openFromBuffer og saveToBuffer for å unngå å skrive til 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-behandle filer med Worker Threads

For store konverteringsoppgaver, fordel arbeidet over Node.js worker threads for å bruke flere CPU‑kjerner:

// 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: Overvåk minne for store modeller

For filer over 50 MB, overvåk heap‑bruk og prosesser filer sekvensielt hvis minnet er begrenset:

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');

Øk Node.js‑heapen for svært store modeller:

node --max-old-space-size=8192 convert.js

Ofte stilte spørsmål

Hva er det mest kompakte utdataformatet?

GLB (binær glTF) med innebygde ressurser gir den mest kompakte enkeltfilutdataen for scener med materialer og teksturer. STL er mer kompakt for kun‑geometri innhold.

Bruker @aspose/3d mesh‑forenkling eller LOD?

Nei. Biblioteket leser og skriver kildegeometrien uten å endre mesh‑topologien. Mesh‑forenkling (reduksjon av vertex, generering av LOD) støttes ikke.

Kan jeg fjerne materialer for å redusere filstørrelsen?

Angi ObjSaveOptions.enableMaterials = false ved lagring til OBJ. For glTF er all materialdata alltid inkludert; bruk STL for kun geometriutdata.


Se også

 Norsk