2015-11-04 18 views
6

Bir WPF uygulamasında UI iş parçacığı üzerinde önemli bir ek yüke neden olan bir dokunmatik ekranın (yalnızca fare olayları değil, & dokunma olayları üreten bir araç) kullanıldığını fark ettim. Ekrana yeterince parmak yerleştirdiysem, uygulamada bazı makinelerde biraz hareket ettirirseniz basit bir uygulama bile durdurabilir. Oldukça tuhaf görünüyor ve yüzünde, çoğunlukla kontrolümün dışında. Bir profiler kullanarak çoğunlukla StylusLogic/InputManager kodunda (Windows.Input) ve Dispatcher.GetMessage rutininde harcanan çok fazla zaman ortaya çıkar.Bir WPF uygulamasında stylus/touch girişinin üstünü azaltabilir miyim?

Bu tür şeyler için herhangi bir “en iyi uygulama” bulamadım ve en yakın çözüm, dokunma desteğini tamamen devre dışı bırakmak (MSDN: Disabling the RealTimeStylus) ve WM_TOUCH iletilerine kendimink yapıp kendi PreviewTouchDown'ımı oluşturmak oldu./PreviewMouseDown olayları (burada "Başka bir WPF tek yönlü" altında tanımlanmıştır: CodeProject: WPF and multi touch) ama bu zaman zaman kendi sorunları olmadan değildir ve uzun vadeli mantıklı bir çözüm olarak beni vurmaz. Ayrıca, tünelleme/kabarcıklanmalarını engellemek için etkinlikleri önceden ele alınmış olarak işaretlemeyi denedim; Her bir PreviewStylusMove olayını (en sık karşılaşılan olay) ana pencere görünümünde bir deneme olarak ele aldım ve bu büyük bir kazanç sağlamadı. Yukarıdaki kod bağlantısı, çoklu dokunma için WPF'de bir hatanın olduğunu (veya olduğunu) belirtirken, geliştirici kurulumumdan (çalışmakta olduğum bazı gerçek iş yazılımları ile) daha güçlü bir PC'de bile tek dokunuşla karşılaşacağımı buldum. Bir süreliğine saniyeler içinde durun ve bekletin ve tek tuşla CPU performansını gözlemlemek için görev yöneticisi/bir profiler kullanarak alışılmadık miktarda çalışmaya devam edebilirsiniz.

Bu olayların sıklığını azaltmak için herhangi bir şey yapabilir miyim (E.G. PreviewStylusMove)? Başka seçeneklerim var mı yoksa kontrolüm dışında mı?

Açıkçası, genel olarak uygulamanın verimliliğini artırmaya çalışmak için çalışabilirim, ancak ekran kalemi/dokunuş böyle büyük bir ilk performans isabeti gibi görünüyor ki bunu azaltmak için neler yapabileceğimi bilmek iyi olurdu.

Tam açıklama: Bu bir .NET 4.5 uygulamasıdır. Bunu, görünür farklılıklar olmadan farklı modellerde/dokunmatik ekranlarda denedim. Bilgisayarım ve uygulamanız, bir basma tıklatma davranışı sol fare düğmesini basılı tutmakla aynıdır, bir sağ tıklama olayı OLMAYAN beklentiyle ayarlanmıştır. Bunu Windows 7 ve Windows 8.1 makinelerinde hiçbir fark olmadan test ettim.

Aşağıdaki örnek, bunu test etmek için kullandığım basit bir uygulamadır. Uygulama penceresine 10 parmak yerleştirdiğimde, anlık olarak duruyor ya da kullandığım bazı bilgisayarlardaki çerçeveleri atlıyor (diğerleri gecikme göstermek için çok hızlı olabilir, ancak yük artışı görev yöneticisi gibi bir şeyde gözlemlenebilir):

<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> 

bir i7-2600 3.4GHz işlemci ile benim makinede lag yapmaz, ama bir Core 2 Duo 2.93GHz işlemci ile benim makinede lag yapar.

+0

Bu takdirde teyit edebilir geçerli konumu fare işaretçisi hareketlerine benzer bir UI iş parçacığı gecikmeden sonra bildirilmektedir şekilde olayları dokunmak eklendi Net 4.6 daha iyi alır? 4.6'da dokunmatik yığın için performans geliştirmeleri yaptıklarını duyduğumu hatırlıyorum, ancak asıl kaynağı şu anda çevrimiçi olarak bulamıyorum. –

+0

Bu testi şimdi 4.6 kullanan bir çift makinada verdim ve ne yazık ki, ne anlatabildiğimden anlamlı/algılanabilir/ölçülebilir bir fark yoktu. Realtimestylus'un devre dışı bırakılmasına bağlantı için – Rory

+0

+1. Benim için bu kısa yöntem, .NET 3.5 ile makul bir şeye performans getirdi. Bu tam bir çözüm olmadığını @Rory ile katılıyorum, ancak şimdilik bir çalışma yaması. –

cevap

2

WPF Ekibi 4.6 ve 4.6.1'de bazı dokunma düzeltmeleri yaptı. (WPF Ekibinde yazılım mühendisiyim)

Bu işi yapan mühendis, bu soruyu okuduktan sonra şunları söyledi: * Evet 4.6.1 önemli ölçüde yardımcı olmalıydı. * Ayrıca, ağır işlemenin dokunmatik olayların dışında yapıldığından da emin olmalıdırlar, çünkü ana parçacığı bağlayacaklardır.

4.6.1 Sürüm adayı Ekim 2015'te kullanıma sunuldu.

Teşekkür Rob Relyea

http://twitter.com/rrelyea

İlgili konular