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
Sfruttare i KeyedService in un'applicazione Blazor in .NET 8
Utilizzare i primary constructor di C# per inizializzare le proprietà
Migrare una service connection a workload identity federation in Azure DevOps
Ottenere il contenuto di una cartella FTP con la libreria FluentFTP
Modificare i metadati nell'head dell'HTML di una Blazor Web App
Utilizzare database e servizi con gli add-on di Container App
Effettuare il pull di git LFS in un workflow di GitHub
Gestire undefined e partial nelle reactive forms di Angular
Utilizzare HiLo per ottimizzare le insert in un database con Entity Framework
Controllare gli accessi IP alle app con Azure Container Apps
Utilizzare politiche di resiliency con Azure Container App
Eseguire attività basate su eventi con Azure Container Jobs