วิธีการเพิ่มประสิทธิภาพโมเดล 3 มิติใน TypeScript

วิธีการเพิ่มประสิทธิภาพโมเดล 3 มิติใน TypeScript

Aspose.3D FOSS สำหรับ TypeScript มีหลายกลยุทธ์เพื่อการลดขนาดไฟล์ผลลัพธ์และเพิ่มประสิทธิภาพการประมวลผล คู่มือนี้ครอบคลุมการเลือกฟอร์แมต, การฝังไบนารี, พายไลน์ในหน่วยความจำ, และการปรับแต่งระดับ Node.js.

คู่มือแบบขั้นตอนต่อขั้นตอน

ขั้นตอนที่ 1: เลือกฟอร์แมตผลลัพธ์ที่เหมาะสม

GLB (binary glTF) ให้ผลลัพธ์ที่กะทัดรัดที่สุดพร้อมการสนับสนุนเครื่องมือที่ดี OBJ เป็นแบบข้อความและมีขนาดใหญ่กว่า STL มีขนาดกะทัดรัดสำหรับเวิร์กโฟลว์ที่มีเพียงเรขาคณิตเท่านั้น.

รูปแบบขนาดรวมวัสดุรวมการเคลื่อนไหวการใช้งานที่ดีที่สุด
GLBเล็กใช่ (ฝังในไฟล์)ใช่เว็บ, เกม, การแลกเปลี่ยนทั่วไป
glTFปานกลางใช่ (แยกไฟล์)ใช่การพัฒนา, การตรวจสอบ
STLเล็กไม่ไม่3D printing, geometry-only
OBJใหญ่แยก .mtlไม่เครื่องมือแบบดั้งเดิม, ความเข้ากันได้กว้าง
FBXปานกลางไม่*ไม่*มีตัวนำเข้า/ส่งออกอยู่แต่ไม่ได้เชื่อมต่อกับการตรวจจับอัตโนมัติ
3MFเล็กใช่ไม่การพิมพ์ 3 มิติสมัยใหม่

ขั้นตอนที่ 2: ส่งออกเป็น Binary GLB

เมื่อบันทึกเป็น GLB, ตั้งค่า GltfSaveOptions.binaryMode = true เพื่อสร้างไฟล์ไบนารีแบบอิสระเดียว. สิ่งนี้หลีกเลี่ยงไฟล์ .bin sidecar และจำเป็นสำหรับโปรแกรมดู 3 มิติหลายตัว:

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 ให้ตรวจสอบการใช้ 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) พร้อมฝัง assets ให้ผลลัพธ์ไฟล์เดียวที่กะทัดรัดที่สุดสำหรับฉากที่มีวัสดุและเทกเจอร์ STL มีขนาดกะทัดรัดมากกว่าเมื่อเป็นเนื้อหาเฉพาะเรขาคณิตเท่านั้น.

@aspose/3d มีการทำ simplification ของเมชหรือ LOD หรือไม่?

ไม่ ไลบรารีนี้อ่านและเขียนเรขาคณิตต้นฉบับโดยไม่แก้ไขโครงสร้างเมช การทำ mesh simplification (ลดจำนวนเวอร์เท็กซ์, สร้าง LOD) ไม่ได้รับการสนับสนุน.

ฉันสามารถลบวัสดุเพื่อลดขนาดไฟล์ได้หรือไม่?

ตั้งค่า ObjSaveOptions.enableMaterials = false เมื่อบันทึกเป็น OBJ. สำหรับ glTF, ข้อมูลวัสดุทั้งหมดจะถูกรวมเสมอ; ใช้ STL สำหรับผลลัพธ์ที่มีเฉพาะเรขาคณิต.


ดูเพิ่มเติม

 ภาษาไทย