Veľkonočná akcia je tu a s ňou aj extra kredity ZADARMO na náš interaktívny e-learning. Dobij si teraz kredity a posuň sa vo svojej kariére vpred!
Zarábaj až 6 000 € mesačne! Akreditované rekvalifikačné kurzy od 0 €. Viac informácií.

Diskusia – 0. Diel WPF - Rýchlosť vykresľovanie

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Avatar
Ondrca
Tvůrce
Avatar
Odpovedá na Ľuboš Čurgó
Ondrca:13.4.2014 13:44

V programování jde všechno od nuly ;)

Odpovedať
13.4.2014 13:44
Zase jsem o něco chytřejší
Avatar
pracansky
Člen
Avatar
pracansky:2.5.2015 12:46

Nepochybuji o tom že WPF má své výhody ale myslím si že zrovna tento příklad je zavádějící. Porovnáváš neporovnatelné. Ve WPF posouváš nakreslený objekt zatímco ve WF rendruješ bitmapy přes procesor a to ještě 2x.

Upravil jsem trochu ten WF projekt. Přidal jsem tam červený panel (panel1) což je obdoba toho rectagle ve WPF a posouvám ho ho stejným způsobem jaky ty ve WPF.

Změnil jsem časování na 1ms aby to sedělo s tím WPF příkladem a dostal jsem stejný výsledek jako WPF. Zatížení procesoru <1% a naprosto plynulý pohyb. Všechno šlo přes GPU. Tetováno na win7.

Předpokládám že použití Graphics ve WPF by bylo stejně pomalé jako je tomu ve WF (ještě to zkusím), takže ten rozdíl není ve WPF ale v použití.

Kdo nevěří ať si to zkusí :)

public partial class Form1 : Form
{
    DateTime lastFrame;
    Rectangle rectangle;

    bool IsRectangleMovingDown = true;

    public Form1()
    {
        InitializeComponent();

        lastFrame = DateTime.Now;

        Timer t = new Timer();
        t.Interval = 1;
        t.Tick += new EventHandler(t_Tick);
        t.Start();
    }

    protected override void OnLoad(EventArgs e)
    {
        rectangle = new Rectangle(0, 0, this.ClientSize.Width, this.ClientSize.Height / 2);
        panel1.Location = rectangle.Location;
        panel1.Size = rectangle.Size;
    }

    void t_Tick(object sender, EventArgs e)
    {
        panel1.Location = rectangle.Location;

        // pohyb obdelníku nahoru a dolů
        if (IsRectangleMovingDown)
        {
            if (rectangle.Y < this.ClientSize.Height / 2)
            {
                rectangle = new Rectangle(rectangle.X, rectangle.Y + 3, rectangle.Width, rectangle.Height);
            }
            else
            {
                IsRectangleMovingDown = false;
            }
        }
        else
        {
            if (rectangle.Y > 0)
            {
                rectangle = new Rectangle(rectangle.X, rectangle.Y - 3, rectangle.Width, rectangle.Height);
            }
            else
            {
                IsRectangleMovingDown = true;
            }
        }

        TimeSpan elapsed = DateTime.Now - lastFrame;
        label1.Text = elapsed.TotalMilliseconds.ToString();

        lastFrame = DateTime.Now;
    }
}

Mimochodem ten DateTime.Now není vhodný na časy v milisekundách.

 
Odpovedať
2.5.2015 12:46
Avatar
coells
Tvůrce
Avatar
coells:2.5.2015 18:22

Mám dotaz na autora článku - proč jako výhodu WPF proti WF ukazuješ jednu z nejvíce zpackaných věcí, která ve WPF je?

WPF je graficky akcelerované, má omezení na 60 FPS (ano, ano, odhad 50-100 FPS pro WPF je nesmysl) a posouvání jedné grafické komponenty přes druhou (přičemž obě jsou cacheované na GPU) zabírá 10% procesu. WTF?! Není náhodou s WPF něco špatně? O tomhle problému se ví už od bety a dodnes s tím nic neudělali.

Navíc, jak už kolega výše trefně podotknul, ve WPF používáš pro animaci layout, zatímco ve WF ručně renderuješ - ke všemu způsobem, který se odjakživa hrubě nedoporučoval. A už ani nebudu zmiňovat fakt, že k tomu pleteš vykreslování písma a zahnuješ to do jednoho měření.

Takovýhle článek je pouhá fabulace, takže si doporučuji nejdřív něco o WPF přečíst, pochopit, jak funguje CPU vs. GPU a pak psát low-level články.

 
Odpovedať
-1
2.5.2015 18:22
Avatar
Theodor Johnson
Tvůrce
Avatar
Odpovedá na coells
Theodor Johnson:2.5.2015 18:34

K článku už se moc vyjadřovat nebudu, co jsem potřeboval napsat tak je v článku nebo komentářích. Spíše ti doporučuji se podívat na tuto sérii od Davida Čápky. Já už jsem po (tuším) pátém díle neměl moc na psaní čas tak jsem tuto sérii neupdatoval ani jsem v ní nepokračoval. :)

Odpovedať
2.5.2015 18:34
Mo8ilε 15 Ѐλđ
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 4 správy z 14.