چگونه مدل‌های 3D را در TypeScript بهینه‌سازی کنیم

چگونه مدل‌های 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 استفاده کنید.


همچنین ببینید

 فارسی