كيفية تحسين نماذج 3D في TypeScript

كيفية تحسين نماذج 3D في TypeScript

Aspose.3D FOSS لـ TypeScript يوفر عدة استراتيجيات لتقليل حجم ملف الإخراج وتحسين معدل المعالجة. يغطي هذا الدليل اختيار الصيغة، تضمين الثنائيات، خطوط الأنابيب في الذاكرة، وتحسينات على مستوى Node.js.

دليل خطوة بخطوة

الخطوة 1: اختر صيغة الإخراج المناسبة

GLB (binary glTF) ينتج أصغر حجم إخراج مع دعم جيد للأدوات. OBJ نصي وأكبر حجماً. STL مضغوط للعمليات التي تتعامل مع الهندسة فقط.

الصيغةالحجميتضمن المواديتضمن الرسوم المتحركةأفضل استخدام
GLBصغيرنعم (مضمن)نعمالويب، الألعاب، التبادل العام
glTFMediumنعم (منفصل)نعمالتطوير، الفحص
STLصغيرلالا3D printing, geometry-only
OBJكبيرملف .mtl منفصللاأدوات قديمة، توافق واسع
FBXمتوسطلا*لا*المستورد/المصدر موجودان لكن غير مدمجين في الكشف التلقائي
3MFصغيرنعملاالطباعة ثلاثية الأبعاد الحديثة

الخطوة 2: تصدير إلى GLB ثنائي

عند الحفظ إلى GLB، اضبط GltfSaveOptions.binaryMode = true لإنتاج ملف ثنائي واحد مستقل. هذا يتجنب وجود ملف منفصل .bin ملف جانبي وهو مطلوب للعديد من عارضات 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');

الخطوة 3: استخدم I/O للذاكرة المؤقتة (Buffer) لخطوط الأنابيب في الذاكرة

عند معالجة الملفات في خدمة ويب، استخدم 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');
}

الخطوة 4: معالجة الملفات على دفعات باستخدام خيوط العامل (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}`));
}

الخطوة 5: راقب الذاكرة للنماذج الكبيرة

للملفات التي تتجاوز 50 ميغابايت، راقب استخدام الكومة (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');

زيادة كومة Node.js للنماذج الكبيرة جدًا:

node --max-old-space-size=8192 convert.js

الأسئلة المتكررة

ما هي صيغة الإخراج الأكثر ضغطًا؟?

GLB (binary glTF) مع الأصول المدمجة ينتج أصغر إخراج ملف واحد للمشاهد التي تحتوي على مواد وملمس. STL أكثر ضغطًا للمحتوى الذي يقتصر على الهندسة فقط.

هل @aspose/3d يطبق تبسيط الشبكة أو LOD؟?

لا. المكتبة تقرأ وتكتب الهندسة المصدرية دون تعديل طوبولوجيا الشبكة. تبسيط الشبكة (تقليل الرؤوس، توليد LOD) غير مدعوم.

هل يمكنني حذف المواد لتقليل حجم الملف؟?

قم بتعيين ObjSaveOptions.enableMaterials = false عند الحفظ إلى OBJ. بالنسبة لـ glTF، يتم دائمًا تضمين جميع بيانات المواد؛ استخدم STL للإخراج الذي يحتوي على الهندسة فقط.


انظر أيضًا

 العربية