Kaip optimizuoti 3D modelius TypeScript
Aspose.3D FOSS for TypeScript suteikia kelias strategijas, kaip sumažinti išvesties failo dydį ir pagerinti apdorojimo pralaidumą. Šiame vadove nagrinėjami formato pasirinkimas, dvejetainis įterpimas, atminties kanalai ir Node.js lygio optimizacijos.
Žingsnis po žingsnio vadovas
Žingsnis 1: Pasirinkite tinkamą išvesties formatą
GLB (binary glTF) sukuria pats kompaktiškiausią išvestį, turint gerą įrankių palaikymą. OBJ yra tekstinis ir didesnis. STL yra kompaktiškas geometrinių duomenų tik darbo srautams.
| Formatas | Dydis | Įtraukia medžiagas | Įtraukia animaciją | Geriausia paskirtis |
|---|---|---|---|---|
| GLB | Mažas | Taip (įterptas) | Taip | Žiniatinklis, žaidimai, bendras mainai |
| glTF | Vidutinis | Taip (atskiras) | Taip | Kūrimas, patikrinimas |
| STL | Mažas | Ne | Ne | 3D printing, geometry-only |
| OBJ | Didelis | Atskiras .mtl | Ne | Senosios priemonės, plati suderinamumas |
| FBX | Vidutinis | Ne* | Ne* | Importuotojas/eksportuotojas egzistuoja, tačiau nėra integruotas į automatinį aptikimą |
| 3MF | Mažas | Taip | Ne | Modernus 3D spausdinimas |
Žingsnis 2: Eksportuokite į binarinį GLB
Išsaugant į GLB, nustatykite GltfSaveOptions.binaryMode = true sukurti vieną savarankišką binarinį failą. Tai išvengia atskirą .bin šoninio failo ir yra būtina daugeliui 3D peržiūros programų:
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');Žingsnis 3: Naudokite buferio I/O atminties vidiniams kanalams
Apdorojant failus žiniatinklio paslaugoje, naudokite openFromBuffer ir saveToBuffer kad išvengtumėte rašymo į failų sistemą:
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');
}Žingsnis 4: Masinis failų apdorojimas naudojant darbinės gijos
Dideliems konvertavimo darbams paskirstykite darbą tarp Node.js darbinės gijos, kad naudotumėte kelias CPU branduolius:
// 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}`));
}Žingsnis 5: Stebėkite atmintį dideliems modeliams
Failams, viršijančioms 50 MB, stebėkite krūvos (heap) naudojimą ir, jei atmintis ribota, apdorokite failus nuosekliai:
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');Padidinkite Node.js krūvą (heap) labai dideliems modeliams:
node --max-old-space-size=8192 convert.jsDažnai užduodami klausimai
Koks yra pats kompaktiškiausias išvesties formatas?
GLB (binary glTF) su įterptais ištekliais sukuria pats kompaktiškiausią vieno failo išvestį scenoms su medžiagomis ir tekstūromis. STL yra kompaktiškesnis, kai turinys susijęs tik su geometrija.
Ar @aspose/3d taiko tinklo (mesh) supaprastinimą arba LOD?
Ne. Biblioteka skaito ir rašo šaltinio geometriją nekeisdama tinklo topologijos. Tinklo supaprastinimas (viršūnių sumažinimas, LOD generavimas) nepalaikomas.
Ar galiu pašalinti medžiagas, kad sumažinčiau failo dydį?
Nustatykite ObjSaveOptions.enableMaterials = false kai išsaugoma į OBJ. Dėl glTF, visi medžiagų duomenys visada įtraukiami; naudokite STL, jei norite tik geometrijos išvesties.