Nel recente update di Ottobre 2018 di Windows 10, è stato introdotto un nuovo set di API pensato per ottenere il massimo delle performace e un miglior uso della GPU.
Questo nuovo set di API si trova sotto il namespace Windows.UI.Xaml.Core.Direct e permette di creare l'UI non attraverso i classici tipi definiti con XAML, ma attraverso oggetti che implementano IXamlDirectObjects.
Prendiamo ad esempio il seguente XAML:
<Grid x:Name="RootGrid"> <Border BorderBrush="Black" BorderThickness="5"> <Rectangle Height="100" Width="100" Fill="Red" /> </Border> </Grid>
Lo stesso codice può essere scritto anche utilizzando la sintassi imperativa:
Border border = new Border(); border.BorderBrush = new SolidColorBrush(Colors.Black); border.BorderThickness = new Thickness(5); Rectangle rectangle = new Rectangle(); rectangle.Height = 100; rectangle.Width = 100; SolidColorBrush rectBrush = new SolidColorBrush(Colors.Red); rectangle.Fill = rectBrush; border.Child = rectangle; RootGrid.Children.Add(border);
Le performace però sono pressoché identiche a quelle ottenute con lo XAML. Di seguito vediamo come ottenere il massimo delle performance. riscrivendo le istruzioni precedenti, questa volta utilizzando il nuovo set di API:
XamlDirectObject border = XamlDirect.CreateInstance(XamlTypeIndex.Border); XamlDirect.SetThicknessProperty(border, XamlPropertyIndex.Border_BorderThickness, new Thickness(5)); IXamlDirectObject borderBrush = XamlDirect.CreateInstance(XamlTypeIndex.SolidColorBrush); XamlDirect.SetColorProperty(borderBrush, XamlPropertyIndex.SolidColorBrush_Color, Colors.Black); XamlDirect.SetXamlDirectObjectProperty(border, XamlPropertyIndex.Border_BorderBrush, borderBrush); IXamlDirectObject rectangle = XamlDirect.CreateInstance(XamlTypeIndex.Rectangle); XamlDirect.SetDoubleProperty(rectangle, XamlPropertyIndex.FrameworkElement_Width, 100); XamlDirect.SetDoubleProperty(rectangle, XamlPropertyIndex.FrameworkElement_Height, 100); IXamlDirectObject rectBrush = XamlDirect.CreateInstance(XamlTypeIndex.SolidColorBrush); XamlDirect.SetColorProperty(rectBrush, XamlPropertyIndex.SolidColorBrush_Color, Colors.Red); XamlDirect.SetXamlDirectObjectProperty(rectangle, XamlPropertyIndex.Shape_Fill, rectangleBrush); XamlDirect.SetXamlDirectObjectProperty(border, XamlPropertyIndex.Border_Child, rectangle); RootGrid.Children.Add((UIElement) XamlDirect.GetObject(border));
È facile intuire, vista la complessità del codice, che le nuove API non sono pensate per realizzare la normale UI delle nostre applicazioni, ma, piuttosto, per la realizzazione e riscrittura di particolari funzionalità, dove ottenere il massimo delle performance dalla scheda grafica è essenziale.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Disabilitare automaticamente un workflow di GitHub
Configurare lo startup di applicazioni server e client con .NET Aspire
Eliminare una project wiki di Azure DevOps
Creare una libreria CSS universale - Rotazione degli elementi
Utilizzare una qualunque lista per i parametri di tipo params in C#
Evitare il flickering dei componenti nel prerender di Blazor 8
Combinare Container Queries e Media Queries
Rendere le variabili read-only in una pipeline di Azure DevOps
Utilizzare EF.Constant per evitare la parametrizzazione di query SQL
Proteggere le risorse Azure con private link e private endpoints
Definire stili a livello di libreria in Angular
Path addizionali per gli asset in ASP.NET Core MVC