Hogyan optimalizáljuk a 3D modelleket TypeScriptben

Hogyan optimalizáljuk a 3D modelleket TypeScriptben

Aspose.3D FOSS for TypeScript több stratégiát kínál a kimeneti fájlméret csökkentésére és a feldolgozási áteresztőképesség javítására. Ez az útmutató a formátum kiválasztását, a bináris beágyazást, a memóriában történő csővezetékeket és a Node.js szintű optimalizációkat tárgyalja.

Lépésről-lépésre útmutató

1. lépés: Válassza ki a megfelelő kimeneti formátumot

A GLB (bináris glTF) a legkisebb kimenetet eredményezi, jó eszköztámogatással. Az OBJ szöveges alapú és nagyobb. Az STL a geometria‑csak munkafolyamatoknál kompakt.

FormátumMéretTartalmaz anyagokatTartalmaz animációtLegjobb felhasználás
GLBKicsiIgen (beágyazott)IgenWeb, játékok, általános csere
glTFKözepesIgen (külön)IgenFejlesztés, ellenőrzés
STLKicsiNemNem3D printing, geometry-only
OBJNagyKülön .mtlNemÖrökölt eszközök, széles kompatibilitás
FBXKözepesNem*Nem*Importáló/exportáló létezik, de nincs összekapcsolva az automatikus felismeréssel
3MFKicsiIgenNemModern 3D nyomtatás

2. lépés: Exportálás bináris GLB‑be

GLB-be mentéskor állítsa be GltfSaveOptions.binaryMode = true hogy egyetlen önálló bináris fájlt hozzon létre. Ez elkerüli a külön .bin kísérőfájlt, és sok 3D megjelenítő számára szükséges:

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. lépés: Használjon Buffer I/O‑t a memóriában lévő csővezetékekhez

Webszolgáltatásban fájlok feldolgozásakor használja openFromBuffer és saveToBuffer a fájlrendszerre írás elkerüléséhez:

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. lépés: Fájlok kötegelt feldolgozása worker szálakkal

Nagy konverziós feladatoknál ossza el a munkát a Node.js worker szálak között, hogy több CPU‑magot használjon:

// 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. lépés: Figyelje a memóriát nagy modellek esetén

50 MB‑nál nagyobb fájloknál figyelje a heap használatát, és ha a memória korlátozott, dolgozza fel a fájlokat sorban:

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

Növelje a Node.js heap méretét nagyon nagy modellekhez:

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

Gyakran Ismételt Kérdések

Mi a legkisebb kimeneti formátum?

A beágyazott eszközökkel rendelkező GLB (bináris glTF) a legkisebb egyfájlos kimenetet adja anyagokkal és textúrákkal rendelkező jelenetekhez. Az STL kompaktabb a csak geometria tartalmú esetekben.

Alkalmazza a @aspose/3d a háló egyszerűsítést vagy LOD‑t?

Nem. A könyvtár a forrásgeometriát olvassa és írja anélkül, hogy módosítaná a háló topológiáját. A háló egyszerűsítése (csúcscsökkentés, LOD generálás) nem támogatott.

Eltávolíthatok anyagokat a fájlméret csökkentése érdekében?

Állítsa be ObjSaveOptions.enableMaterials = false OBJ mentésekor. A glTF esetén minden anyagadat mindig benne van; használja az STL-t a csak geometriai kimenethez.


Lásd még

 Magyar