چگونه مدلهای 3D را در TypeScript بهینهسازی کنیم
Aspose.3D FOSS برای TypeScript چندین استراتژی برای کاهش حجم فایل خروجی و بهبود توان پردازشی ارائه میدهد. این راهنما به انتخاب فرمت، جاسازی باینری، خطوط لوله در‑حافظه و بهینهسازیهای سطح Node.js میپردازد.
راهنمای گام به گام
مرحله ۱: انتخاب فرمت خروجی مناسب
GLB (binary glTF) کوچکترین خروجی را با پشتیبانی ابزارهای خوب تولید میکند. OBJ مبتنی بر متن است و بزرگتر است. STL برای جریانهای کاری فقط هندسهای فشرده است.
| قالب | اندازه | شامل مواد | شامل انیمیشن | بهترین استفاده |
|---|---|---|---|---|
| GLB | کوچک | بله (درونساخت) | بله | وب، بازیها، تبادل عمومی |
| glTF | متوسط | بله (جدا) | بله | توسعه، بازرسی |
| STL | کوچک | خیر | خیر | 3D printing, geometry-only |
| OBJ | بزرگ | جدا .mtl | خیر | ابزارهای قدیمی، سازگاری گسترده |
| FBX | متوسط | خیر* | خیر* | واردکننده/صادرکننده موجود است اما به تشخیص خودکار متصل نشده است |
| 3MF | کوچک | بله | خیر | چاپ سهبعدی مدرن |
مرحله ۲: خروجی به صورت GLB باینری
هنگام ذخیره به GLB، تنظیم کنید GltfSaveOptions.binaryMode = true برای تولید یک فایل باینری تکفایلی خودکفا. این کار از sidecar جداگانه جلوگیری میکند .bin sidecar و برای بسیاری از نمایشگرهای 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');مرحله ۳: استفاده از I/O با بافر برای خطوط لوله در‑حافظه
هنگام پردازش فایلها در یک سرویس وب، از openFromBuffer و saveToBuffer برای جلوگیری از نوشتن بر روی سیستم فایل:
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');
}مرحله ۴: پردازش دستهای فایلها با استفاده از Worker Threads
برای کارهای تبدیل بزرگ، کار را بین Worker Threadsهای Node.js توزیع کنید تا از چندین هسته 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}`));
}مرحله ۵: نظارت بر حافظه برای مدلهای بزرگ
برای فایلهای بالای ۵۰ مگابایت، مصرف heap را نظارت کنید و در صورت محدودیت حافظه، فایلها را بهصورت متوالی پردازش کنید:
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');افزایش heap Node.js برای مدلهای بسیار بزرگ:
node --max-old-space-size=8192 convert.jsسوالات متداول
فشردهترین فرمت خروجی چیست؟?
GLB (binary glTF) با دارا بودن داراییهای جاسازیشده، فشردهترین خروجی تکفایلی را برای صحنههای دارای مواد و بافتها تولید میکند. STL برای محتوای فقط هندسهای فشردهتر است.
آیا @aspose/3d سادهسازی مش یا LOD اعمال میکند؟?
خیر. این کتابخانه هندسه منبع را میخواند و مینویسد بدون اینکه توپولوژی مش را تغییر دهد. سادهسازی مش (کاهش رئوس، تولید LOD) پشتیبانی نمیشود.
آیا میتوانم مواد را حذف کنم تا حجم فایل کاهش یابد؟?
تنظیم کنید ObjSaveOptions.enableMaterials = false هنگام ذخیره به فرمت OBJ. برای glTF، تمام دادههای متریال همیشه گنجانده میشود؛ برای خروجی صرفاً هندسی از STL استفاده کنید.