איך למטב מודלים תלת-ממדיים ב-TypeScript
Aspose.3D FOSS עבור TypeScript מספק כמה אסטרטגיות לצמצום גודל קובץ הפלט ולשיפור קצב העיבוד. מדריך זה מכסה בחירת פורמט, הטמעת בינארי, צינורות בזיכרון, ואופטימיזציות ברמת Node.js.
מדריך שלב אחר שלב
שלב 1: בחר את פורמט הפלט הנכון
GLB (binary glTF) מייצר את הפלט הקומפקטי ביותר עם תמיכה טובה בכלים. OBJ הוא מבוסס טקסט וגדול יותר. STL הוא קומפקטי לעבודה עם גאומטריה בלבד.
| פורמט | גודל | כולל חומרים | כולל אנימציה | שימוש מומלץ |
|---|---|---|---|---|
| GLB | קטן | כן (מוטמע) | כן | אינטרנט, משחקים, החלפה כללית |
| glTF | בינוני | כן (נפרד) | כן | פיתוח, בדיקה |
| STL | קטן | לא | לא | 3D printing, geometry-only |
| OBJ | גדול | להפריד .mtl | לא | כלים ישנים, תאימות רחבה |
| FBX | בינוני | לא* | לא* | קיים ייבוא/ייצוא אך אינו משולב בזיהוי אוטומטי |
| 3MF | קטן | כן | לא | הדפסה תלת‑ממדית מודרנית |
שלב 2: ייצא ל‑GLB בינארי
בעת שמירה ל‑GLB, הגדר GltfSaveOptions.binaryMode = true כדי לייצר קובץ בינארי יחיד עצמאי. זה מונע את ה‑ .bin קובץ צדדי ונדרש עבור רוב הצופים בתלת‑ממד:
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: השתמש ב‑Buffer 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');
}שלב 4: עיבוד קבצים במקבצים באמצעות 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}`));
}שלב 5: נטר את הזיכרון עבור מודלים גדולים
עבור קבצים מעל 50 MB, נטר את השימוש בערמת הזיכרון ועבד קבצים ברצף אם הזיכרון מוגבל:
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 לפלט של גאומטריה בלבד.