Wie man 3D-Modelle in TypeScript optimiert
Aspose.3D FOSS für TypeScript bietet mehrere Strategien zur Reduzierung der Ausgabedateigröße und zur Verbesserung des Verarbeitungsthroughputs. Dieser Leitfaden behandelt die Formatwahl, das Einbetten von Binärdaten, In-Memory-Pipelines und Optimierungen auf Node.js-Ebene.
Schritt-für-Schritt-Anleitung
Schritt 1: Wählen Sie das richtige Ausgabeformat
GLB (binary glTF) erzeugt die kompakteste Ausgabe bei guter Tool-Unterstützung. OBJ ist textbasiert und größer. STL ist kompakt für rein geometrische Workflows.
| Format | Größe | Enthält Materialien | Enthält Animation | Beste Verwendung |
|---|---|---|---|---|
| GLB | Klein | Ja (eingebettet) | Ja | Web, Spiele, allgemeiner Austausch |
| glTF | Mittel | Ja (separat) | Ja | Entwicklung, Inspektion |
| STL | Klein | Nein | Nein | 3D printing, geometry-only |
| OBJ | Groß | Separate .mtl | Nein | Legacy-Tools, breite Kompatibilität |
| FBX | Mittel | Nein* | Nein* | Importer/exporter existieren, sind aber nicht in die automatische Erkennung eingebunden |
| 3MF | Klein | Ja | Nein | Moderne 3D-Druck |
Schritt 2: Exportieren Sie zu Binary GLB
Beim Speichern in GLB, setze GltfSaveOptions.binaryMode = true um eine einzelne, eigenständige Binärdatei zu erzeugen. Dies vermeidet die separate .bin Sidecar und ist für viele 3D-Viewer erforderlich:
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');Schritt 3: Verwenden Sie Buffer-I/O für In-Memory-Pipelines
Beim Verarbeiten von Dateien in einem Webservice, verwende openFromBuffer und saveToBuffer um das Schreiben auf das Dateisystem zu vermeiden:
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');
}Schritt 4: Stapelverarbeitung von Dateien mit Worker-Threads
Für große Konvertierungsaufgaben verteilen Sie die Arbeit auf Node.js-Worker-Threads, um mehrere CPU-Kerne zu nutzen:
// 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}`));
}Schritt 5: Überwachen Sie den Speicher für große Modelle
Bei Dateien über 50 MB sollten Sie die Heap-Nutzung überwachen und Dateien sequenziell verarbeiten, wenn der Speicher begrenzt ist:
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');Erhöhen Sie den Node.js-Heap für sehr große Modelle:
node --max-old-space-size=8192 convert.jsHäufig gestellte Fragen
Welches ist das kompakteste Ausgabeformat?
GLB (binary glTF) mit eingebetteten Assets erzeugt die kompakteste Einzeldateiausgabe für Szenen mit Materialien und Texturen. STL ist kompakter für rein geometrische Inhalte.
Wendet @aspose/3d Mesh‑Vereinfachung oder LOD an?
Nein. Die Bibliothek liest und schreibt die Quellgeometrie, ohne die Mesh-Topologie zu verändern. Mesh‑Vereinfachung (Vertex‑Reduktion, LOD‑Erzeugung) wird nicht unterstützt.
Kann ich Materialien entfernen, um die Dateigröße zu reduzieren?
Setzen ObjSaveOptions.enableMaterials = false beim Speichern als OBJ. Für glTF werden immer alle Materialdaten eingeschlossen; verwenden Sie STL für eine reine Geometrieausgabe.