Cara Mengoptimalkan Model 3D dalam TypeScript

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.

FormatUkuranMenyertakan MaterialMenyertakan AnimasiPenggunaan Terbaik
GLBKecilYa (tersemat)YaWeb, game, pertukaran umum
glTFSedangYa (terpisah)YaPengembangan, inspeksi
STLKecilTidakTidak3D printing, geometry-only
OBJBesarPisahkan .mtlTidakAlat warisan, kompatibilitas luas
FBXSedangTidak*Tidak*Pengimpor/pengekspor ada tetapi tidak terhubung ke deteksi otomatis
3MFKecilYaTidakPencetakan 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.js

Pertanyaan 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.


Lihat Juga

 Bahasa Indonesia