Jak optymalizować modele 3D w TypeScript
Aspose.3D FOSS dla TypeScript oferuje kilka strategii zmniejszania rozmiaru pliku wyjściowego i zwiększania przepustowości przetwarzania. Ten przewodnik obejmuje wybór formatu, osadzanie binarne, potoki w pamięci oraz optymalizacje na poziomie Node.js.
Przewodnik krok po kroku
Krok 1: Wybierz odpowiedni format wyjściowy
GLB (binary glTF) generuje najbardziej kompaktowy wynik przy dobrej obsłudze narzędzi. OBJ jest oparty na tekście i większy. STL jest kompaktowy w przepływach pracy zawierających wyłącznie geometrię.
| Format | Rozmiar | Zawiera materiały | Zawiera animację | Najlepsze zastosowanie |
|---|---|---|---|---|
| GLB | Mały | Tak (osadzony) | Tak | Web, gry, wymiana ogólna |
| glTF | Średni | Tak (oddzielnie) | Tak | Rozwój, inspekcja |
| STL | Mały | Nie | Nie | 3D printing, geometry-only |
| OBJ | Duży | Oddzielny .mtl | Nie | Narzędzia legacy, szeroka kompatybilność |
| FBX | Średni | Nie* | Nie* | Importer/exporter istnieje, ale nie jest podłączony do automatycznego wykrywania |
| 3MF | Mały | Tak | Nie | Nowoczesny druk 3D |
Krok 2: Eksportuj do binarnego GLB
Podczas zapisywania do GLB, ustaw GltfSaveOptions.binaryMode = true aby wygenerować pojedynczy, samodzielny plik binarny. To eliminuje osobny .bin plik pomocniczy i jest wymagany przez wiele przeglądarek 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');Krok 3: Użyj operacji I/O na buforze dla potoków w pamięci
Podczas przetwarzania plików w usłudze internetowej, użyj openFromBuffer i saveToBuffer aby uniknąć zapisu do systemu plików:
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');
}Krok 4: Przetwarzaj pliki wsadowo przy użyciu wątków pracowników
W przypadku dużych zadań konwersji, rozdziel pracę na wątki pracowników Node.js, aby wykorzystać wiele rdzeni 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}`));
}Krok 5: Monitoruj pamięć przy dużych modelach
Dla plików powyżej 50 MB, monitoruj zużycie sterty i przetwarzaj pliki kolejno, jeśli pamięć jest ograniczona:
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');Zwiększ stertę Node.js dla bardzo dużych modeli:
node --max-old-space-size=8192 convert.jsNajczęściej zadawane pytania
Jaki jest najbardziej kompaktowy format wyjściowy?
GLB (binary glTF) z osadzonymi zasobami generuje najbardziej kompaktowy jednoplikowy wynik dla scen z materiałami i teksturami. STL jest bardziej kompaktowy dla treści zawierających wyłącznie geometrię.
Czy @aspose/3d stosuje upraszczanie siatki lub LOD?
Nie. Biblioteka odczytuje i zapisuje źródłową geometrię bez modyfikacji topologii siatki. Upraszczanie siatki (redukcja wierzchołków, generowanie LOD) nie jest obsługiwane.
Czy mogę usunąć materiały, aby zmniejszyć rozmiar pliku?
Ustaw ObjSaveOptions.enableMaterials = false przy zapisywaniu do OBJ. Dla glTF wszystkie dane materiałowe są zawsze dołączane; użyj STL dla wyjścia zawierającego tylko geometrię.