Design
3DEraJs e EderaCore
IL progetto 3DEra è formato da un framework sviluppato in C/C++ (EderaCore, compilato in WebAssembly) e da una liberria Javascript che espone un set di funzionalità di alto livello (3DEraJs).
L'idea alla base del framework, è quella di delegare la parte più complessa della programmazione grafica ad un core modulare formato da librerie indipendenti (già da sole portabili lato javascript), e da uno strato composto da un pattern architetturale denominato “Entity-Component-System”, mutuato da un approccio consolidato nell’industria dei videogiochi.
Entity Component System
“Data oriented design” è una metodologia di sviluppo software nato nell’industria dei videogiochi in risposta alla necessità di ottimizzare l’uso di cache e thread nelle moderne CPU. Al centro di questo approccio è posta la gestione dei dati attraverso un layout che prevede la divisione di questi per tipologia in blocchi di memoria contigua. Le “azioni” deputate alla trasformazione dei dati non sono perciò più gestite a livello di “classe” ma andranno a costituire dei “sistemi” deputati a svolgere una determinata funzione secondo la logica di implementazione.
L’introduzione a questa metodologia fa da fondamentale prerequisito alla descrizione del pattern architetturale “Entity-Component-System”.
Definizioni secondo la terminologia attualmente in uso:
- Entity: consiste in un “id” univoco (in genere un semplice numero), il cui scopo è dare la rappresentazione di un oggetto astratto.
- Component: rappresenta il dato sotto forma di singolo attributo al quale un “Entity” può fare riferimento.
- System: al suo interno “componenti” trattati in un singolo blocco continuo di memoria vengono processati in modo iterativo secondo una logica comune. Component-Manager: mappa la connessione tra gli elementi “entity” e un singolo “component”.
Links:
L'architettura ECS in 3DEra
Lato "front end" Hedera non da accesso diretto all'engine, pertanto l'aggiunta di nuovi elementi può avvenire solo attraverso la creazione di "collectors" (insieme di oggetti "components" template) o il caricamento di una scena descritta in un file "glb".
Ogni azione specifica sulla scena, viene raprresentata da una singola funzione che associa un'entià ai parametri formali.
All'interno del core in WebAssembly, l'istruzione verrà instantaneamente schedulata nella queue di una struttra system e processata durante l'esecuzione del main-loop.Everything is Known
EderaCore cerca di ottimizzare al massimo l'uso della memoria già in fase di inizializzazione e principalmete per questo motivo, non è consentito creare elementi di una scena via javascript.
L'unico modo per avere una proiezione dell'effettiva quantità di risorse da allocare, arriva da una descrizione della scenea in formato Json. Attraverso le specifiche disegnate per questa finalità, è possibilie elencare esplitamente tutte le tipologie di dati da utilizzare, il numero e infine la modalità con cui questi dati verrano poi computati dall'engine.