Mi sono reso conto che l'utilizzo di un touchscreen (uno che genera gli eventi di tocco dello stilo & e non solo gli eventi del mouse) sembra causare un sovraccarico significativo sul thread dell'interfaccia utente in un'applicazione WPF. Anche una semplice applicazione può essere fermata se metto abbastanza dita sullo schermo, sopra l'applicazione, e le sposiamo un po 'su certe macchine. Sembra piuttosto strano e in apparenza, per lo più fuori dal mio controllo. L'utilizzo di un profiler ha rivelato molto tempo speso principalmente nel codice StylusLogic/InputManager (Windows.Input) e nella routine Dispatcher.GetMessage.Posso ridurre il sovraccarico di input stilo/tocco in un'applicazione WPF?
non sono stato in grado di trovare qualsiasi “buone pratiche” per questo genere di cose, e la soluzione più vicina che potrebbe venire a era quello di disabilitare il supporto tocco del tutto (MSDN: Disabling the RealTimeStylus) e agganciare in messaggi WM_TOUCH me stesso, generando la mia PreviewTouchDown/Eventi PreviewMouseDown (sorta di descritto qui sotto "Un altro modo WPF solo": CodeProject: WPF and multi touch) ma questo non è senza i suoi problemi a volte e non mi sembra una soluzione ragionevole a lungo termine. Ho anche provato a contrassegnare gli eventi come gestiti in anticipo per impedire loro di scavare tunnel/bolle; Ho contrassegnato ogni evento PreviewStylusMove (l'evento più frequente) come gestito nella vista della finestra principale come un esperimento e questo non sembra fornire un enorme guadagno. Mentre il link codeproject sopra afferma che c'era un bug in WPF per il multi-touch, ho trovato che anche il single-touch su un PC meno potente di quello del mio sviluppatore (con alcuni software aziendali reali su cui lavoro) rallenta e si blocca per secondi alla volta e puoi ancora osservare una quantità insolita di lavoro utilizzando il task manager/un profiler per osservare le prestazioni della CPU con il single-touch.
Posso fare qualcosa per ridurre la frequenza di questi eventi (E.G. PreviewStylusMove)? Ho altre opzioni o è tutto fuori dal mio controllo?
Ovviamente, posso lavorare sul tentativo di migliorare l'efficienza dell'applicazione in generale, ma lo stilo/tocco sembra un grande successo in termini di prestazioni iniziali che sarebbe bene sapere cosa posso fare per mitigarlo.
Descrizione completa: Questa è un'applicazione .NET 4.5. Ho provato questo su diversi modelli/marche di touchscreen senza differenze visibili. Il mio computer e la mia applicazione sono impostati con l'aspettativa che il comportamento push-and-hold sia identico a tenere premuto un pulsante sinistro del mouse, NON a generare un evento con il clic destro. Ho provato questo su entrambe le macchine Windows 7 e Windows 8.1 senza differenze.
L'esempio seguente è una semplice applicazione che ho usato per testare questo. Quando metto 10 dita sulla finestra dell'applicazione, si blocca momentaneamente o salta i fotogrammi su alcuni computer che ho usato (altri potrebbero essere troppo veloci per visualizzare il ritardo ma l'aumento del carico può essere osservato in qualcosa come Task Manager):
<Window x:Class="SimpleApplication.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:SimpleApplication"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Rectangle Fill="Aqua" Width="150" Height="150" RenderTransformOrigin="0.5, 0.5">
<Rectangle.RenderTransform>
<RotateTransform />
</Rectangle.RenderTransform>
<Rectangle.Triggers>
<EventTrigger RoutedEvent="Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="(Rectangle.RenderTransform).(RotateTransform.Angle)"
To="-360"
Duration="0:0:2"
RepeatBehavior="Forever" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Rectangle.Triggers>
</Rectangle>
</Grid>
non restare sulla mia macchina con un processore 3.4GHz i7-2600, ma fa ritardo sulla mia macchina con un core 2 Duo 2,93 GHz.
Potete confermare se questo migliora in .Net 4.6? Ricordo di aver sentito che hanno apportato miglioramenti delle prestazioni per il touch stack in 4.6, ma non riesco a trovare la vera fonte online in questo momento. –
Ho eseguito un test su un paio di macchine usando 4.6 e, purtroppo, non c'era alcuna differenza significativa/percepibile/misurabile da quello che potevo dire. – Rory
+1 per il collegamento alla disabilitazione di realtimestylus. per me quel metodo breve ha portato le prestazioni in qualcosa di ragionevole con .NET 3.5. Sono d'accordo con @Rory che questa non è una soluzione completa, ma per ora è una patch funzionante. –