Nel corso degli anni abbiamo appreso che la direzione di sviluppo di Silverlight è stata fortemente orientata ad affiancare WPF come framework completo per realizzare applicazioni desktop, pur mantenendo la propria identità nel contesto di plugin per applicazioni web in-browser. Semplicità, performance e "gestibilità" con tool come Expression Blend ha consentito al plugin di ricevere grandi consensi, con adozioni anche in applicazioni enterprise, tanto da spingere Microsoft a proseguire nello sviluppo sempre più nella direzione di ridurre la forbice che lo separa da WPF, sia come compatibilità del markup che come funzionalità di accesso diretto alle risorse del client.
Nel primo articolo abbiamo introdotto le novità sul markup e l'evoluzione del già potente engine di binding, in questo secondo vediamo i nuovi strumenti che abbiamo a disposizione nello sviluppo di applicazioni out-of-browser, come l'uso di librerie native con P/Invoke, l'accesso completo al file system ed i miglioramenti al flusso di rendering oltre ad un breve accenno sulle API per il 3D.
Animazioni su render thread separato da UI (alcune)
In Silverlight 4 le animazioni, input dell'utente, rendering in reazione al binding ed altro sono a carico dell'UI thread, quindi quando cerchiamo di eseguire operazioni che si protraggono nel tempo e sono in corso animazioni, quest'ultime non appaiono fluide come programmate ed hanno delle vere e proprie interruzioni in diretta relazione alla durata delle operazioni lunghe in corso.
Elaborando un principio sviluppato per Windows Phone, in Silverlight 5 è stato introdotta la possibilità di spostare alcune animazioni in un thread diverso da quello dell'UI, nonostante si trattino ancora di operazioni a video.In particolare, possiamo spostare sul thread UI indipendente quelle animazioni che riguardano oggetti che possono essere gestiti dalla GPU, cioè animazioni che interessano le proprietà:
- RenderTransform;
- Clip;
- Opacity;
- Visibility;
- Projection.
Mentre non sono gestibili quelle proprietà che invalidano il caching video degli oggetti, come gli Effect, OpacityMask, Clip con Geometry non rettangolare, ecc..
Dopo aver verificato di essere nelle condizioni sopra descritte, per spostare le animazioni sul thread separato sono necessarie due operazioni:
- valorizzare la proprietà CacheMode con BitmapCache per quegli elementi che sono oggetto di animazioni;
- abilitare l'accelerazione hardware con il parametro tra i parametri dell'oggetto Silverlight.
<param name="enableGPUAcceleration" value="true"/>
Possiamo testare la validità ed i benefici di questa funzionalità applicando un Thread.Sleep a livello di code behind (bloccando esplicitamente il thread UI) oppure abilitando la visualizzazione degli oggetti gestiti dalla GPU con il parametro
<param name="enableCacheVisualization" value="true"/>
Riproduzione di suoni senza latenza
Nelle versioni precedenti avevamo a disposizione solo il controllo MediaElement per riprodurre suoni. La struttura del controllo richiedeva un certo tempo per caricare in memoria prima di riprodurre effettivamente il suono, questa latenza poteva non essere accettabile nel caso di voler decorare con effetti sonori alcuni eventi generati dall'input dell'utente.
In Silverlight 5 è stato introdotto l'oggetto SoundEffect presente nelle librerie di XNA, in particolare nell'assembly Microsoft.Xna.Framework.dll.
Il suo utilizzo consiste nel recuperare lo stream di un file audio presente all'interno della dll del progetto, quindi con la direttiva BuildAction impostata a Content e creare con esso un oggetto SoundEffect, ecco un esempio:
var soundStream = Application.GetResourceStream(new Uri("stereol.wav", UriKind.RelativeOrAbsolute)); var effect = SoundEffect.FromStream(soundStream.Stream); SoundEffectInstance soundInstance = effect.CreateInstance(); soundInstance.IsLooped = false; soundInstance.Pitch = -1.0f; soundInstance.Volume = 0.75f; soundInstance.Play();
SoundEffectInstance disponde nelle principali funzioni per gestire la riproduzione ed il volume.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Creare una libreria CSS universale: Clip-path
Aggiungere interattività lato server in Blazor 8
Ottimizzare le performance delle collection con le classi FrozenSet e FrozenDictionary
Supporto ai tipi DateOnly e TimeOnly in Entity Framework Core
Assegnare un valore di default a un parametro di una lambda in C#
Utilizzare Tailwind CSS all'interno di React: primi componenti
Utilizzare un service principal per accedere a Azure Container Registry
Evitare il flickering dei componenti nel prerender di Blazor 8
Modificare i metadati nell'head dell'HTML di una Blazor Web App
Code scanning e advanced security con Azure DevOps
Triggerare una pipeline su un altro repository di Azure DevOps
Miglioramenti nelle performance di Angular 16