Com optimitzar models 3D a TypeScript
Aspose.3D FOSS per TypeScript ofereix diverses estratègies per reduir la mida dels fitxers de sortida i millorar el rendiment del processament. Aquesta guia cobreix la selecció de format, la incrustació binària, les canonades en memòria i les optimitzacions a nivell de Node.js.
Guia pas a pas
Pas 1: Trieu el format de sortida adequat
GLB (binary glTF) produeix la sortida més compacta amb bon suport d’eines. OBJ és basat en text i és més gran. STL és compacte per a fluxos de treball només de geometria.
| Format | Mida | Inclou materials | Inclou animació | Millor ús |
|---|---|---|---|---|
| GLB | Petit | Sí (incrustat) | Sí | Web, jocs, intercanvi general |
| glTF | Mitjà | Sí (separat) | Sí | Desenvolupament, inspecció |
| STL | Petit | No | No | 3D printing, geometry-only |
| OBJ | Gran | .mtl separat | No | Eines heretades, gran compatibilitat |
| FBX | Mitjà | No* | No* | L’importer/exporter existeix però no està connectat a la detecció automàtica |
| 3MF | Petit | Sí | No | Impressió 3D moderna |
Pas 2: Exporta a GLB binari
En desar a GLB, establiu GltfSaveOptions.binaryMode = true per generar un únic fitxer binari autònom. Això evita el separat .bin fitxer sidecar i és necessari per a molts visualitzadors 3D:
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');Pas 3: Utilitzeu Buffer I/O per a canonades en memòria
En processar fitxers en un servei web, utilitzeu openFromBuffer i saveToBuffer per evitar escriure al sistema de fitxers:
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');
}Pas 4: Processa fitxers per lots amb fils de treball
Per a tasques de conversió grans, distribuïu la feina entre fils de treball de Node.js per utilitzar múltiples nuclis de 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}`));
}Pas 5: Superviseu la memòria per a models grans
Per a fitxers de més de 50 MB, superviseu l’ús del heap i processeu els fitxers seqüencialment si la memòria és limitada:
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');Augmenteu el heap de Node.js per a models molt grans:
node --max-old-space-size=8192 convert.jsPreguntes freqüents
Quin és el format de sortida més compacte?
GLB (binary glTF) amb actius incrustats produeix la sortida d’un sol fitxer més compacta per a escenes amb materials i textures. STL és més compacte per a contingut només de geometria.
Aplica @aspose/3d simplificació de malles o LOD?
No. La biblioteca llegeix i escriu la geometria d’origen sense modificar la topologia de la malla. La simplificació de malles (reducció de vèrtexs, generació de LOD) no està suportada.
Puc eliminar els materials per reduir la mida del fitxer?
Estableix ObjSaveOptions.enableMaterials = false en desar a OBJ. Per a glTF, totes les dades de material s’inclouen sempre; utilitzeu STL per a una sortida només de geometria.