Jak optimalizovat 3D modely v TypeScriptu
Aspose.3D FOSS pro TypeScript poskytuje několik strategií pro snížení velikosti výstupního souboru a zlepšení propustnosti zpracování. Tento průvodce pokrývá výběr formátu, binární vkládání, paměťové pipeline a optimalizace na úrovni Node.js.
Průvodce krok za krokem
Krok 1: Vyberte správný výstupní formát
GLB (binary glTF) produkuje nejkompaktnější výstup s dobrou podporou nástrojů. OBJ je textový a větší. STL je kompaktní pro workflowy zaměřené pouze na geometrii.
| Formát | Velikost | Obsahuje materiály | Obsahuje animaci | Nejlepší využití |
|---|---|---|---|---|
| GLB | Malý | Ano (vložené) | Ano | Web, hry, obecná výměna |
| glTF | Střední | Ano (samostatné) | Ano | Vývoj, kontrola |
| STL | Malý | Ne | Ne | 3D tisk, pouze geometrie |
| OBJ | Velký | Samostatný .mtl | Ne | Legacy nástroje, široká kompatibilita |
| FBX | Střední | Ne* | Ne* | Importér/exportér existuje, ale není napojen na automatické rozpoznání |
| 3MF | Malý | Ano | Ne | Moderní 3D tisk |
Krok 2: Export do binárního GLB
Při ukládání do GLB nastavte GltfSaveOptions.binaryMode = true tak, aby vytvořil jediný samostatný binární soubor. Tím se vyhnete samostatnému souboru .bin a je to vyžadováno mnoha 3D prohlížeči:
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');Krok 3: Použijte Buffer I/O pro pipeline v paměti
Při zpracování souborů ve webové službě použijte openFromBuffer a saveToBuffer, abyste se vyhnuli zápisu do souborového systému:
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');
}Krok 4: Dávkové zpracování souborů pomocí pracovních vláken
Pro velké konverzní úlohy distribuujte práci napříč pracovními vlákny Node.js, abyste využili více jader CPU:
// 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}`));
}Krok 5: Sledovat paměť pro velké modely
Pro soubory větší než 50 MB monitorujte využití haldy a zpracovávejte soubory sekvenčně, pokud je paměť omezena:
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');Zvyšte haldu Node.js pro velmi velké modely:
node --max-old-space-size=8192 convert.jsČasto kladené otázky
Jaký je nejkompaktnější výstupní formát?
GLB (binary glTF) s vloženými prostředky produkuje nejkompaktnější jednosouborový výstup pro scény s materiály a texturami. STL je kompaktnější pro obsah pouze s geometrií.
Používá @aspose/3d zjednodušení meshe nebo LOD?
Ne. Knihovna čte a zapisuje zdrojovou geometrii, aniž by měnila topologii sítě. Zjednodušení sítě (redukování vrcholů, generování LOD) není podporováno.
Mohu odstranit materiály, abych snížil velikost souboru?
Nastavte ObjSaveOptions.enableMaterials = false při ukládání do OBJ. Pro glTF jsou vždy zahrnuty všechna data materiálu; použijte STL pro výstup pouze s geometrií.