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átum | Méret | Tartalmaz anyagokat | Tartalmaz animációt | Legjobb felhasználás |
|---|---|---|---|---|
| GLB | Kicsi | Igen (beágyazott) | Igen | Web, játékok, általános csere |
| glTF | Közepes | Igen (külön) | Igen | Fejlesztés, ellenőrzés |
| STL | Kicsi | Nem | Nem | 3D printing, geometry-only |
| OBJ | Nagy | Külön .mtl | Nem | Örökölt eszközök, széles kompatibilitás |
| FBX | Közepes | Nem* | Nem* | Importáló/exportáló létezik, de nincs összekapcsolva az automatikus felismeréssel |
| 3MF | Kicsi | Igen | Nem | Modern 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.jsGyakran 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.