Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

WPF animation performance

Îåêßíçóå áðü ôï ìÝëïò Mike Pos. Τελευταία δημοσίευση από το μέλος Mike Pos στις 15-03-2013, 15:31. Υπάρχουν 4 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  14-03-2013, 17:09 72329

    WPF animation performance

    Θελω να κανω μια ερωτηση σχετικα με το ποιος τροπος ειναι πιο αποτελεσματικος για animation πολλων controls μαζι. Ουσιαστικα θελω να φτιαξω ενα animated TabPanel, φαινεται μονο το tabitem και οταν κανεις κλικ εμφανιζεται με κυλιση ολο το tabcontrol στην οθονη, και αντιστοιχα κλεινει. Το θεμα ειναι οτι προφανως επειδη περιεχει αρκετα κοντρολ η κινηση δεν ειναι ομαλη. Αυτα που εχω δοκιμασει ειναι τα εξης:
    Να αλλαξω το framerate: δεν ειδα διαφορα
    Να κανω animation to width του tabcontrol content απο 0 σε 500 πχ και το αντιστροφο στο κλεισιμο
    Να κανω animation to margin του tabcontrol απο 0,0,-500,0 σε 0: Νομιζω ειχε καλυτερη ανταποκριση, τουλαχιστον στο ανοιγμα

    Σκεφτηκα ισως με το κλικ να επαιρνε screenshot απο το tabcontrol, να γινοταν ολα τα control Visibility=Collapsed και screenshot =Visible ακριβως απο πανω και να κανω animation to screenshot ως μια εικονα μονο. Θα ειναι αποτελεσματικο αυτο ή να μη μπω καν στον κοπο; Έχει κανεις καμια άλλη ιδέα; Αν εχει καποιος το χρονο και τη διαθεση ας μου απαντησει. Ευχαριστώ!
  •  14-03-2013, 17:16 72330 σε απάντηση της 72329

    Απ: WPF animation performance

    Πως το έχεις κάνει το animation? 
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  14-03-2013, 17:26 72331 σε απάντηση της 72330

    Απ: WPF animation performance

    Σε XAML δοκιμασα DoubleAnimation και DoubleAnimationUsingKeyFrames μπας και εχει διαφορα.


    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.Width)" Storyboard.TargetName="TabControl1">
                <EasingDoubleKeyFrame KeyTime="0" Value="99"/>
                <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="450"/>
            </DoubleAnimationUsingKeyFrames>
  •  14-03-2013, 22:42 72332 σε απάντηση της 72331

    Απ: WPF animation performance

    Κατάλαβες και ο ίδιος ότι εκεί που εστίασες την προσοχή σου δεν έχει μεγάλο κέρδος σε επιδόσεις.Αυτά που θα σε βοηθήσουν πολύ είναι τα εξής:
    α)Μείωσε το animation σου εκεί που έχει σημασία για την εφαρμογή σου.Αν κάποιο στοιχείο του control σου θα μπορούσε κάλλιστα να μη συμμετέχει στο animation,άστο εκτός αυτού.
    β)Με διαφορά το ακριβότερο performance hit για την εφαρμογή σου,είναι να προκαλέσει ένα layout pass.Για να γίνω πιο σχετικός με το παράδειγμά σου,θα δεις εμφανή διαφορά στην απόδοση στον κώδικα που μας έδειξες αν αντί να κάνεις animate το width του control σου,κάνεις animate ένα ScaleTransform που θα έχεις θέσει ως RenderTransform του element που κάνεις animate.Γιατί;Επειδή το RenderTransform δεν προκαλεί καινούριο layout pass,ενώ η αλλαγή απευθείας του width την προκαλεί.
    γ)Πάλι για λόγους layout,πολύπλοκα container όπως το Grid έχουν μεγάλη διαφορά στις επιδόσεις όταν τα κάνεις animate σε σύγκριση με απλούστερα,όπως το Canvas.
    Υπάρχουν και άλλα optimization που μπορείς να κάνεις,αλλά τα β και γ θα κάνουν αισθητή διαφορά.


  •  15-03-2013, 15:31 72334 σε απάντηση της 72332

    Απ: WPF animation performance

    Δοκιμασα με TranslateTransform και ειδα διαφορα, οχι μεγαλη, αλλα το προβλημα συνεχισε να υπαρχει.
    Εβαλα στο tabcontrol CacheMode -> BitMapCache, που ουσιαστικα κανει κατι σαν το screenshot που ελεγα, αλλα να πω την αληθεια δε παρατηρησα διαφορα. Φανταζομαι απο τα λιγοστα που ξερω οτι θα εχει χρησιμοτητα σε πολυ πιο συνθετα animations.
    Τελικα το προβλημα ηταν το εξης:
    Πισω απο το κινουμενο πανελ εχω ενα αρκετα βαρυ κοντρολ, με πολλα κελια και mouseover states για highlight κλπ, και καθε φορα που σερνοταν το πανελ πανω στο κοντρολ για να κλεισει, και επεφτε το ποντικι πανω στα κελια, αναγκαζε το κοντρολ σε πολλαπλα layout passes, ειδικα αμα κουνουσες το ποντικι πανω απο τα κελια κατα τη διαρκεια του animation.
    Αυτο που εκανα τελικα ειναι πριν ξεκινησει το animation, βαζω πανω απο αυτο το κοντρολ ενα VisualBrush με Visual Binding το ιδιο κοντρολ, σαν καλυμμα δλδ, και οταν τελειωσει το animation το αφαιρω. Ετσι γλυτωνω ολα τα layout passes και επιτελους εχω ενα ομορφο ομαλο animation!!Big Smile
    Ευχαριστω πολυ για τη βοηθεια, το ειχα αγνοησει τελειως το RenderTransform και τα πλεονεκτηματα του...
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems