Cara Mengoptimalkan Model 3D dalam TypeScript
Aspose.3D FOSS untuk TypeScript menyediakan beberapa strategi untuk mengurangi ukuran file output dan meningkatkan throughput pemrosesan. Panduan ini mencakup pemilihan format, penyematan biner, pipeline dalam memori, dan optimasi tingkat Node.js.
Panduan Langkah-demi-Langkah
Langkah 1: Pilih Format Output yang Tepat
GLB (binary glTF) menghasilkan output paling kompak dengan dukungan alat yang baik. OBJ berbasis teks dan lebih besar. STL kompak untuk alur kerja yang hanya berisi geometri.
| Format | Ukuran | Menyertakan Material | Menyertakan Animasi | Penggunaan Terbaik |
|---|---|---|---|---|
| GLB | Kecil | Ya (tersemat) | Ya | Web, game, pertukaran umum |
| glTF | Sedang | Ya (terpisah) | Ya | Pengembangan, inspeksi |
| STL | Kecil | Tidak | Tidak | 3D printing, geometry-only |
| OBJ | Besar | Pisahkan .mtl | Tidak | Alat warisan, kompatibilitas luas |
| FBX | Sedang | Tidak* | Tidak* | Pengimpor/pengekspor ada tetapi tidak terhubung ke deteksi otomatis |
| 3MF | Kecil | Ya | Tidak | Pencetakan 3D modern |
Langkah 2: Ekspor ke GLB Biner
Saat menyimpan ke GLB, atur GltfSaveOptions.binaryMode = true untuk menghasilkan satu file biner yang berdiri sendiri. Ini menghindari .bin sidecar dan diperlukan untuk banyak penampil 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');Langkah 3: Gunakan I/O Buffer untuk Pipeline dalam Memori
Saat memproses file dalam layanan web, gunakan openFromBuffer dan saveToBuffer untuk menghindari penulisan ke sistem file:
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');
}Langkah 4: Proses File Secara Batch dengan Worker Threads
Untuk pekerjaan konversi besar, distribusikan pekerjaan ke worker threads Node.js untuk memanfaatkan banyak core 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}`));
}Langkah 5: Pantau Memori untuk Model Besar
Untuk file lebih dari 50 MB, pantau penggunaan heap dan proses file secara berurutan jika memori terbatas:
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');Tingkatkan heap Node.js untuk model yang sangat besar:
node --max-old-space-size=8192 convert.jsPertanyaan yang Sering Diajukan
Apa format output paling kompak?
GLB (binary glTF) dengan aset tersemat menghasilkan output satu file paling kompak untuk adegan dengan material dan tekstur. STL lebih kompak untuk konten yang hanya berisi geometri.
Apakah @aspose/3d menerapkan penyederhanaan mesh atau LOD?
Tidak. Perpustakaan ini membaca dan menulis geometri sumber tanpa mengubah topologi mesh. Penyederhanaan mesh (pengurangan vertex, pembuatan LOD) tidak didukung.
Apakah saya dapat menghapus material untuk mengurangi ukuran file?
Setel ObjSaveOptions.enableMaterials = false saat menyimpan ke OBJ. Untuk glTF, semua data material selalu disertakan; gunakan STL untuk output hanya geometri.