Kā optimizēt 3D modeļus TypeScript valodā
Aspose.3D FOSS for TypeScript piedāvā vairākas stratēģijas, lai samazinātu izvada faila lielumu un uzlabotu apstrādes caurplūdi. Šis ceļvedis aptver formāta izvēli, bināro iegulšanu, atmiņā esošas cauruļvadu apstrādes un Node.js līmeņa optimizācijas.
Solī pa solim ceļvedis
1. solis: Izvēlieties pareizo izvada formātu
GLB (binārais glTF) rada viskompakto izvadīšanu ar labu rīku atbalstu. OBJ ir teksta bāzēts un lielāks. STL ir kompakts ģeometrijas tikai darbplūsmām.
| Formāts | Izmērs | Ietver materiālus | Ietver animāciju | Labākā lietošana |
|---|---|---|---|---|
| GLB | Mazs | Jā (iekļauts) | Jā | Tīmeklis, spēles, vispārēja apmaiņa |
| glTF | Vidējs | Jā (atsevišķi) | Jā | Izstrāde, pārbaude |
| STL | Mazs | Nē | Nē | 3D printing, geometry-only |
| OBJ | Liels | Atsevišķs .mtl | Nē | Mantotie rīki, plaša saderība |
| FBX | Vidējs | Nē* | Nē* | Importētājs/eksportētājs pastāv, bet nav savienots ar automātisko noteikšanu |
| 3MF | Mazs | Jā | Nē | Mūsdienīga 3D drukāšana |
2. solis: Eksportēt uz bināro GLB
Saglabājot uz GLB, iestatiet GltfSaveOptions.binaryMode = true lai izveidotu vienu pašpietiekamu bināro failu. Tas novērš atsevišķo .bin palīgfailu un ir nepieciešams daudzām 3D skatītājprogrammām:
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. solis: Izmantojiet bufera I/O atmiņā esošām cauruļvadu apstrādēm
Apstrādājot failus tīmekļa pakalpojumā, izmantojiet openFromBuffer un saveToBuffer lai izvairītos no rakstīšanas failu sistēmā:
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('output.glb');
}4. solis: Grupveida apstrāde ar darbinieku pavedieniem
Lieliem konvertēšanas uzdevumiem izplatiet darbu pāri Node.js darbinieku pavedieniem, lai izmantotu vairākus CPU kodolus:
// 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. solis: Uzraudzīt atmiņu lieliem modeļiem
Failiem, kas pārsniedz 50 MB, uzraugiet kaudzes (heap) lietojumu un apstrādājiet failus secīgi, ja atmiņa ir ierobežota:
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');Palieliniet Node.js kaudzi ļoti lieliem modeļiem:
node --max-old-space-size=8192 convert.jsBiežāk uzdotie jautājumi
Kāds ir viskompaktais izvada formāts?
GLB (binārais glTF) ar iegultajiem resursiem rada viskompakto vienfaila izvadīšanu ainas ar materiāliem un tekstūrām gadījumā. STL ir kompakts ģeometrijas tikai saturam.
Vai @aspose/3d piemēro režģa vienkāršošanu vai LOD?
Nē. Bibliotēka lasa un raksta avota ģeometriju, nemodificējot režģa topoloģiju. Tīklu vienkāršošana (virsotņu reducēšana, LOD ģenerēšana) netiek atbalstīta.
Vai varu noņemt materiālus, lai samazinātu faila lielumu?
Iestatīt ObjSaveOptions.enableMaterials = false kad saglabā OBJ. Attiecībā uz glTF, visi materiālu dati vienmēr tiek iekļauti; izmantojiet STL, lai iegūtu tikai ģeometrijas izvadi.