Pattern Flyweight in Pratica: Predisporre un’Applicazione per il Precache
Posted by Ricibald on 18th January 2010
Il pattern Flyweight consente di riutilizzare gli oggetti in modo da poter evitare allocazioni. Questo risulta utile se:
- gli oggetti da creare richiedono molta memoria
- gli oggetti da creare sono molti
- gli oggetti da creare sono costosi da creare (e distruggere) dal punto di vista computazionale
- i vincoli impongono un sistema che non abbia cali improvvisi di performance, derivanti ad esempio dall’inizializzazione pesante di un oggetto
- i vincoli impongono un utilizzo molto attento delle risorse
- un’animazione può avere tante caratteristiche ingenti da memorizzare come accelerazione, direzione, …
- un word processor utilizza migliaia di caratteri con le stesse info su font, dimensione, colore, …
- un’immagine: il caricamento richiede ogni volta l’accesso al filesystem
- un videogioco deve avere fps costanti e non avere improvvisi picchi negativi di 10fps solo perché si alloca una risorsa
- un dispositivo mobile come il Nokia o l’iPhone
- la memoria inizia a non essere sufficiente per le info necessarie
- l’allocazione/deallocazione causa picchi negativi di fps, ora (più) evidenti a causa dello stesso degrado delle performance generali
- lo stato intrinseco della biglia nel flyweight
- posizione, comportamento specifico della biglia
- lo stato estrinseco della biglia nella nostra app, che lo passa al flyweight
- immagine, colore, dimensione, comportamenti comuni di animazioni
- veniva creata e associata l’immagine corrispondente
- veniva aggiunta l’immagine alla scena corrente assegnando uno z-index
- veniva assegnato un comportamento della biglia: quanto rimbalzare, se esplode, …
- …
capire come predisporre una applicazione per fare uso di un precaching in modo da abilitare il pattern con poco sforzo
- l’allocazione e deallocazione, che causavano picchi negativi di fps sono presenti un’unica volta
- creiamo le premesse per un precaching di ad es. 40 biglie, utile per impedire completamente il problema di picchi negativi di fps
dividere inizializzazione estrinseca da inizializzazione intrinseca in modo da poter riutilizzare l’inizializzazione quando richiesto
- allo startup la FlyweightFactory crea ad es. 40 biglie e le mantiene in un proprio pool di precaching
- quando alla app serve una biglia richiede un’istanza disponibile alla FlyweightFactory
- la FlyweightFactory restituirà un’istanza dal pool con lo stato intrinseco correttamente inizializzato
- quando la biglia non viene più referenziata nella nostra app ma esiste solo nella FlyweightFactory deve esistere una strategia per marcare l’istanza come disponibile nel pool (es. un meccanismo di notifica a eventi)
Fare questo a fronte della divisione tra allocazione/inizializzazione è un gioco da ragazzi!
Il flusso di inizializzazione diventa quindi:
- allo startup viene inizializzato lo stato estrinseco
- la FlyweightFactory alloca un pool di 40 biglie passando lo stato estrinseco
- le singole istanze memorizzano il riferimento allo stato estrinseco
- la app richiede un’istanza alla FlyweightFactory
- la FlyweightFactory inizializza un’istanza disponibile dal pool e la restituisce. Rimangono quindi 39 biglie nel pool
- la app usa la biglia. Quando non serve più la rimuove dalla app
- la app lancia un evento di avvenuta rimozione della biglia
- la FlyweightFactory riceve l’evento e aggiunge la biglia nel pool delle istanze disponibili. Rimangono quindi 40 biglie nel pool
Posted in .net, performance | 1 Comment »