كيفية تحسين نماذج 3D في TypeScript
Aspose.3D FOSS لـ TypeScript يوفر عدة استراتيجيات لتقليل حجم ملف الإخراج وتحسين معدل المعالجة. يغطي هذا الدليل اختيار الصيغة، تضمين الثنائيات، خطوط الأنابيب في الذاكرة، وتحسينات على مستوى Node.js.
دليل خطوة بخطوة
الخطوة 1: اختر صيغة الإخراج المناسبة
GLB (binary glTF) ينتج أصغر حجم إخراج مع دعم جيد للأدوات. OBJ نصي وأكبر حجماً. STL مضغوط للعمليات التي تتعامل مع الهندسة فقط.
| الصيغة | الحجم | يتضمن المواد | يتضمن الرسوم المتحركة | أفضل استخدام |
|---|---|---|---|---|
| GLB | صغير | نعم (مضمن) | نعم | الويب، الألعاب، التبادل العام |
| glTF | Medium | نعم (منفصل) | نعم | التطوير، الفحص |
| 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 للإخراج الذي يحتوي على الهندسة فقط.