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