Wie man 3D-Modelle in TypeScript optimiert
Aspose.3D FOSS für TypeScript bietet mehrere Strategien zur Verringerung der Ausgabe-Dateigröße und Verbesserung des Prozessdurchsatzes. Dieser Leitfaden umfasst die Formatwahl, binäre Einbettung, In-Memory Pipelines und Optimierungen auf Node.js-Ebene.
Schritt für Schritte
Schritt 1: Wählen Sie das richtige Ausgabeformat aus
GLB (binärer glTF) erzeugt die kompakte Ausgabe mit guter Werkzeugunterstützung. OBJ ist textbasiert und größer. STL ist kompakt für geometrische Workflows.
| Format der Datenbank | Größe | Inhalte enthalten | Animation enthalten | Beste Verwendung |
|---|---|---|---|---|
| GLB | Kleine | Ja (eingebettet) | - Ja , das ist gut . | Internet, Spiele und allgemeiner Austausch |
| GFT-Systeme | Mittelmäßig | Ja (getrennt) | - Ja , das ist gut . | Entwicklung, Inspektion |
| STL | Kleine | - Nein . | - Nein . | 3D printing, geometry-only |
| OBJ | Großes | Separate .mtl-Dateien | - Nein . | Alte Werkzeuge, breite Kompatibilität |
| FBX | Mittelmäßig | Nicht verfügbar* | Nicht verfügbar* | Importeur/Exporter existiert, ist aber nicht mit der automatischen Erkennung verbunden. |
| 3MF | Kleine | - Ja , das ist gut . | - Nein . | Moderne 3D-Drucktechnik |
Schritt 2: Export in die binäre GLB
Bei der Einsparung auf GLB wird die GltfSaveOptions.binaryMode = true Die Daten werden in einer einzelnen binären Datei erstellt, wodurch die getrennte .bin Seitenauto und ist für viele 3D-Betrachter 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: Buffer-E/A für Inmemory-Pipelines verwenden
Bei der Verarbeitung von Dateien in einem Webdienst verwenden Sie die Funktion “Datenverarbeitungs- und -überwachung” (WEB openFromBuffer und . saveToBuffer Um das Datensystem nicht zu schreiben:
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: Batch-Prozessdateien mit Arbeiterthreads
Für große Konvertierungsarbeiten verteilen Sie die Arbeit über Node.js-Workertreads, um mehrere CPU-Kerne zu verwenden:
// 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 das Speicher für große Modelle
Für Dateien über 50 MB, die Heap-Nutzung zu überwachen und Sequenzdateien verarbeiten, wenn der Speicher eingeschränkt 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');Erweitern 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 kompakte Ausgabeformat?
GLB (binärer glTF) mit eingebetteten Assets erzeugt den kompakten Single-File Output für Szenen mit Materialien und Texturen. STL ist kompakterer für nur geometrische Inhalte.
Wird die Maschenvereinfachung oder LOD von @aspose/3d angewendet?
Die Bibliothek liest und schreibt die Quellgeometrie, ohne die Maschentopologie zu ändern.
Kann ich Material entfernen, um die Dateigröße zu verringern?
Setz ObjSaveOptions.enableMaterials = false bei der Speicherung auf OBJ. Für glTF sind immer alle Materialdaten enthalten; für die Ausgabe nur Geometrie verwendet STL.