Як оптимізувати 3D‑моделі в TypeScript
Aspose.3D FOSS для TypeScript пропонує кілька стратегій зменшення розміру вихідного файлу та підвищення пропускної здатності обробки. У цьому посібнику розглядаються вибір формату, вбудовування бінарних даних, конвеєри в пам’яті та оптимізації на рівні Node.js.
Покроковий посібник
Крок 1: Виберіть правильний вихідний формат
GLB (бінарний glTF) створює найкомпактніший вихід з хорошою підтримкою інструментів. OBJ — текстовий і більший. STL є компактним для робочих процесів лише з геометрією.
| Формат | Розмір | Містить матеріали | Містить анімацію | Найкраще використання |
|---|---|---|---|---|
| GLB | Малий | Так (вбудовано) | Так | Веб, ігри, загальний обмін |
| glTF | Medium | Так (окремо) | Так | Розробка, інспекція |
| 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 для виводу лише геометрії.