كيفية تحسين النماذج ثلاثية الأبعاد في TypeScript

كيفية تحسين النماذج ثلاثية الأبعاد في TypeScript

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

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

الخطوة 1: اختر تنسيق الإخراج الصحيح

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

FormatSizeIncludes MaterialsIncludes AnimationBest Use
GLBصغيرنعم (مضمن)نعمالويب، الألعاب، التبادل العام
glTFمتوسطنعم (منفصل)نعمالتطوير، الفحص
STLصغيرلالاالطباعة ثلاثية الأبعاد، الهندسة فقط
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: استخدم إدخال/إخراج المؤقت للأنابيب داخل الذاكرة

عند معالجة الملفات في خدمة الويب، استخدم 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: معالجة الملفات على دفعات باستخدام خيوط العامل

للمهام الكبيرة للتحويل، وزّع العمل عبر خيوط عمل 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');

زيادة مساحة heap في Node.js للنماذج الكبيرة جدًا:

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

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

ما هو أكثر تنسيق إخراج مضغوط؟

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

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

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

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

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


انظر أيضًا

 العربية