Cara Mengoptimumkan Model 3D dalam TypeScript
Aspose.3D FOSS for TypeScript menyediakan beberapa strategi untuk mengurangkan saiz fail output dan meningkatkan kelajuan pemprosesan. Panduan ini merangkumi pemilihan format, penyematan binari, paip dalam memori, dan pengoptimuman pada peringkat Node.js.
Panduan Langkah demi Langkah
Langkah 1: Pilih Format Output yang Betul
GLB (binary glTF) menghasilkan output paling padat dengan sokongan alatan yang baik. OBJ berasaskan teks dan lebih besar. STL lebih padat untuk aliran kerja yang hanya mengandungi geometri.
| Format | Saiz | Termasuk Bahan | Termasuk Animasi | Penggunaan Terbaik |
|---|---|---|---|---|
| GLB | Kecil | Ya (terbenam) | Ya | Web, permainan, pertukaran umum |
| glTF | Sederhana | Ya (berasingan) | Ya | Pembangunan, pemeriksaan |
| STL | Kecil | Tidak | Tidak | 3D printing, geometry-only |
| OBJ | Besar | Pisahkan .mtl | Tidak | Alat warisan, keserasian luas |
| FBX | Sederhana | Tidak* | Tidak* | Importer/exporter wujud tetapi tidak disambungkan ke auto-detection |
| 3MF | Kecil | Ya | Tidak | Pencetakan 3D moden |
Langkah 2: Eksport ke GLB Binari
Apabila menyimpan ke GLB, tetapkan GltfSaveOptions.binaryMode = true untuk menghasilkan satu fail binari berdiri sendiri. Ini mengelakkan fail berasingan .bin sidecar dan diperlukan untuk banyak penonton 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 Penampan untuk Paip Dalam Memori
Apabila memproses fail dalam perkhidmatan web, gunakan openFromBuffer dan saveToBuffer untuk mengelakkan penulisan ke sistem fail:
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('output.glb');
}Langkah 4: Proses Fail Secara Kelompok dengan Thread Pekerja
Untuk kerja penukaran berskala besar, agihkan kerja merentasi thread pekerja Node.js untuk menggunakan berbilang teras 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 fail melebihi 50 MB, pantau penggunaan heap dan proses fail secara berurutan jika memori terhad:
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.jsSoalan Lazim
Apakah format output yang paling padat?
GLB (binary glTF) dengan aset tersemat menghasilkan output satu fail paling padat untuk adegan dengan bahan dan tekstur. STL lebih padat untuk kandungan yang hanya mengandungi geometri.
Adakah @aspose/3d menggunakan penyederhanaan mesh atau LOD?
Tidak. Perpustakaan membaca dan menulis geometri sumber tanpa mengubah topologi mesh. Penyederhanaan mesh (pengurangan vertex, penjanaan LOD) tidak disokong.
Bolehkah saya menanggalkan materials untuk mengurangkan saiz fail?
Tetapkan ObjSaveOptions.enableMaterials = false apabila menyimpan ke OBJ. Untuk glTF, semua data bahan sentiasa disertakan; gunakan STL untuk output hanya geometri.