Com optimitzar models 3D en TypeScript

Com optimitzar models 3D en TypeScript

Aspose.3D FOSS per a 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 correcte

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.

FormatMidaInclou MaterialsInclou AnimacióMillor Ús
GLBPetitSí (incrustat)Web, jocs, intercanvi general
glTFMitjàSí (separat)Desenvolupament, inspecció
STLPetitNoNoImpressió 3D, només geometria
OBJGranSeparat .mtlNoEines antigues, gran compatibilitat
FBXMitjàNo*No*Existeixen importador/exportador però no estan integrats a la detecció automàtica
3MFPetitNoImpressió 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 fitxer auxiliar .bin separat 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: Utilitza Buffer I/O per a pipelines en memòria

Quan es processin 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: Processament per lots de fitxers amb fils de treball

Per a tasques de conversió grans, distribuïu la feina entre els fils de treball de Node.js per utilitzar diversos 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: Monitoritzar la memòria per a models grans

Per a fitxers de més de 50 MB, monitoritzeu 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');

Augmenta l’heap de Node.js per a models molt grans:

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

Preguntes freqüents

Quin és el format de sortida més compacte?

GLB (binary glTF) amb actius incrustats produeix la sortida d’un únic 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 la simplificació de malla o LOD?

No. La llibreria 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 és compatible.

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; utilitza STL per a una sortida només de geometria.


Vegeu també

 Català