Як оптимізувати 3D‑моделі в TypeScript

Як оптимізувати 3D‑моделі в TypeScript

Aspose.3D FOSS для TypeScript пропонує кілька стратегій зменшення розміру вихідного файлу та підвищення пропускної здатності обробки. У цьому посібнику розглядаються вибір формату, вбудовування бінарних даних, конвеєри в пам’яті та оптимізації на рівні Node.js.

Покроковий посібник

Крок 1: Виберіть правильний вихідний формат

GLB (бінарний glTF) створює найкомпактніший вихід з хорошою підтримкою інструментів. OBJ — текстовий і більший. STL є компактним для робочих процесів лише з геометрією.

ФорматРозмірМістить матеріалиМістить анімаціюНайкраще використання
GLBМалийТак (вбудовано)ТакВеб, ігри, загальний обмін
glTFMediumТак (окремо)ТакРозробка, інспекція
STLМалийНіНі3D printing, geometry-only
OBJВеликийОкремий .mtlНіЗастарілі інструменти, широка сумісність
FBXСереднійНі*Ні*Імпортер/експортер існує, але не підключений до автоматичного виявлення
3MFМалийТакНіСучасний 3D друк

Крок 2: Експортуйте у бінарний GLB

При збереженні у форматі GLB, встановіть GltfSaveOptions.binaryMode = true для створення одного самодостатнього бінарного файлу. Це уникає окремого .bin sidecar і є необхідним для багатьох 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: Використовуйте 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 МБ слідкуйте за використанням 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 (бінарний glTF) з вбудованими ресурсами створює найкомпактніший однорядковий вихід для сцен з матеріалами та текстурами. STL більш компактний для контенту лише з геометрією.

Чи застосовує @aspose/3d спрощення сітки або LOD?

Ні. Бібліотека читає та записує вихідну геометрію без зміни топології сітки. Спрощення сітки (зменшення кількості вершин, генерація LOD) не підтримується.

Чи можна прибрати матеріали, щоб зменшити розмір файлу?

Встановіть ObjSaveOptions.enableMaterials = false при збереженні у OBJ. Для glTF усі дані матеріалів завжди включаються; використовуйте STL для виводу лише геометрії.


Див. також

 Українська