Pagina 1 di 1

Sistema a retention

Inviato: 30/01/2015, 16:48
da InformateciBot
Essendo un termine inventato dal Cisternino, qualcuno potrebbe linkarmi del materiale da cui capire cosa intende per sistema a retention e in cosa differisce dai classici "sistemi a paint"? Se vi costa meno fatica va bene anche una spiegazione veloce... Da quel che ho capito WinForm è un sistema basato su paint e WPF basato su retention, però su interent non sono riuscito a trovare nessuna spiegazione tecnica abbastanza a basso livello su questi dettagli..

MindFlyer
Sicuro che sia inventato da Cisternino? La parola mi fa suonare una campanella, ma non mi ricordo dove l'ho vista. Forse su un manuale di programmazione una caterva di anni fa?

Joker
Penso di sì, precisamente li chiama "retention-based rendering systems" e su internet non si trova niente a riguardo a parte la sua pagina. Magari l'ha tirato fuori da qualcosa ma non sembra esser presente nella documentazione popolare
Ho trovato questa spiegazione, ma non la trovo molto soddisfacente...
http://stackoverflow.com/questions/21543061/rendering-models-retention-vs-paint

MindFlyer
Però ha senso. Nel paint ridisegni ogni finestra ogni volta che occorre, nel retention usi una pipeline di rendering con una macchina a stati "globale". Forse non si dilunga molto a spiegare come mai le due cose siano necessariamente in contrapposizione... Ma chi ha fatto la domanda su Stack Overflow è di Pisa? oO

Joker
Sicuramente... La differenza quindi sarebbe che in un sistema immediato ogni volta che si aggiorna la schermata vanno richiamate tutte le primitive grafiche che vogliamo disegnare mentre in quello a retention viene salvato tutto lo stato grafico e il sistema gestisce da solo il drawing? Forse mi sbaglio ma mi sembra ci si possa vedere un'analogia con la differenza tra il vecchio OpenGL e quello moderno...

Prendendo inoltre spunto da un modello a retention come il web browser (HTML ecc...), qui abbiamo una serie di oggetti grafici che l'engine disegnerà quando riterrà opportuno... Mi sembra una visione più ad alto livello del drawing, è questo il punto cruciale?

MindFlyer
Sembra tutto sensato, però bisognerà chiedere a Cisternino.

mz_
un sistema "a paint" è un sistema in cui (ponendoci nel programmatore di aplicazioni) quando si effettua una modifica che deve essere visualizzata sullo schermo (es: l'effetto click su un pulsante di una finestra) occorre chiamare la funzione paint().
La funzione paint chiama tutte le primitive grafiche una ad una ridisegnando la pagina da 0.

In un sistema "a retention" ciò che è visualizzato a schermo è organizzato in una struttura dati (solitamente un albero). Per esempio il DOM delle pagine web.
Quando il programmatore vuole fare una modifica a ciò che viene visualizzato a schermo deve solo modificare i valori della struttura dati. Il livello sottostante si preoccuperà di tutto il resto.
Prendendo come esempio la modifica ad una pagina web in javascript avremo

Codice: Seleziona tutto

div.innerHTML = "il Cisternino insegna a Pisa"; 
Il programmatore non ha il compito di scrivere (nel metodo paint) del codice che si occupi della disposizione di questa stringa sullo schermo, della conversione di una stringa in bitmap con un determinato font, della chiamata della primitiva che disegna una bitmap, ecc.


Ora che mi ci fate pensare, anch'io l'ho sentito solo dal Cisternino questo termine per ora ma è anche vero che non l'ho mai cercato da nessuna parte.

Manutio
Mi rendo conto di arrivare un po' tardi, ma lascio comunque la risposta nel caso serva a qualcuno in futuro.

Effettivamente sì, il sistema a retention è una parola inventata dal cisternino e che non esiste in concreto, ma a quanto pare la sua schematizzazione teorica del concetto rispecchia in maniera grossolana il funzionamento della grafica nei principali sistemi .

Sostanzialmente è giusto quello che ha scritto mz_:
mz_;297 ha scritto: In un sistema "a retention" ciò che è visualizzato a schermo è organizzato in una struttura dati (solitamente un albero). Per esempio il DOM delle pagine web.
Quando il programmatore vuole fare una modifica a ciò che viene visualizzato a schermo deve solo modificare i valori della struttura dati. Il livello sottostante si preoccuperà di tutto il resto.
Facciamo un esempio concreto: supponiamo di avere una finestra aperta e non ridotta a icona, ma interamente coperta da un'altra finestra. Se questa finestra si aggiornasse in modo costante (esempio: il canvas di un video che deve cambiare fotogramma per fotogramma il suo contenuto) sarebbe stupido chiamare la paint (operazione costosa) in continuazione anche se la finestra non si vede.

In un sistema a paint verrebbe ogni volta chiamata la paint del video e successivamente quella della finestra che lo copre (che si ridisegna uguale). In sostanza si hanno 2 paint inutili, la prima per disegnare un contenuto che verrà coperto e la seconda per disegnare un contenuto visibile che però è tale e quale a prima.

In un sistema a retention si modifica l'albero dicendo che in quella finestra va disegnata una bitmap e si informa il sistema che potrebbe essere necessario ridisegnare. Il sistema controlla se il contenuto è visibile e solo se lo è (quindi non in questo caso) ridisegna. In più vengono ridisegnati solo i componenti necessari.

Un sistema a retention è più efficace se "la finestra" invece di fornire una bitmap fornisce una funzione che deve essere chiamata per disegnarne il contenuto. Questo fa sì che la funzione non venga calcolata ogni volta dalla finestra per restituire la bitmap ma sia chiamata dal sistema solo se effettivamente la bitmap serve
Ancora meglio se vengono usate funzioni come "draw line", "draw rect" ecc., perché non si ridisegna tutta l'area della finestra ma si chiama solo le funzioni che disegnano nell'area visibile (nel caso in cui per esempio la finestra sia coperta solo in parte).