Cara Mengoptimumkan Model 3D dalam TypeScript

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.

FormatSaizTermasuk BahanTermasuk AnimasiPenggunaan Terbaik
GLBKecilYa (terbenam)YaWeb, permainan, pertukaran umum
glTFSederhanaYa (berasingan)YaPembangunan, pemeriksaan
STLKecilTidakTidak3D printing, geometry-only
OBJBesarPisahkan .mtlTidakAlat warisan, keserasian luas
FBXSederhanaTidak*Tidak*Importer/exporter wujud tetapi tidak disambungkan ke auto-detection
3MFKecilYaTidakPencetakan 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.js

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


Lihat Juga

 Bahasa Melayu