Rýchlosť kreslenia čiar vo VB a WPF   zodpovězená otázka

VB.NET, WPF, Grafika

Potrebujem kresliť väčší počet čiar kde záleží aj na rýchlosti vykreslovania. V tomto fóre som sa dočítal že grafika vo WPF je HW akcelerovaná graf.kartou cez DirectX a WPF sa dá integrovať aj do Winforms, tak som chcel porovnať rozdiel c rýchlosti vykreslovania medzi Winforms a WPF. Vo VB.NET Express 2010 som urobil WPF projekt a náhodne som vygeneroval 100 000 úsečiek a nechal ich vykresliť na Canvas a odmeral čas potrebný na vykreslenie. Následne som urobil projekt aj vo VB .net a rovnako vykreslil 100 000 úsečiek do Pictureboxu. Namerané časy sú takmer rovnaké rozdiel z priemerov 10 meraní je cca 0.1 sek. čiže nepodstatný. Vo WPF som nikdy nič nerobil tak neviem či som to išiel dobre. Ak má niekto skúsenosti s podobnou tématikou poprosil by som či by ma nemohol nasmerovať správnym smerom. Vopred ďakujem.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Použil bych jednoznačně Windows Forms. Musíte si uvědomit, že WPF funguje tak, že si udržuje informace o každé ze 100 000 úseček, kdežto Windows Forms pouze celkový výsledný obraz. Rychlosti budou +- stejné a hardwarová akcelerace ve WPF nijak nepomůže.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tohle není úplně pravda, ve WPF si můžete napsat vlastní komponentu a kreslit na ekvivalent Canvasu ve WinForms. Každá čára nemusí nutně být reprezentována objektem.

Pokud by WinForms výkonově nestačily, použijte DirectX přímo.

Budete mít o vrstvu míň než při použití WPF.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zatímco ve WinForms si i po vykreslení musíte stále všechny čáry pamatovat, pokud je kreslíte v metodě onPaint - musíte být připraven na to, že tato metoda bude zavolaná znova a vy budete nucen okno překreslit. Toto WPF řeší za vás tím, že si pamatuje, kde ty čáry jsou pro případné překreslení.

Takže ta vámi zmíněná výhoda, že si to ve WinForms nemusíte pamatovat mi přijde nesmyslná.

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

Pánové pánové, motáte to všechno dokupy.

Ve WPFku je samozřejmě objekt čára, elipsa atd. Pokud by se to vykreslovalo pomocí nich, tak si to samozřejmě musí všechny čáry pamatovat a při velkém množství čar to zabere dost paměti - WPFko má poměrně velký overhead. Na tisíci prvků se to nepozná, na stovkách tisíc už ano.

Ale i ve WPFku se dají kreslit čáry na nějaký Canvas (nevím přesně, jak se to jmenuje) a nemusí být nutně každá vykreslovaná čára reprezentována WPF objektem.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To ano,

já jen říkám, že ten argument, že ve WinForms si to nemusí pamatovat je nesmyslné. Protože Paint nemusí být nutně zavolaný jen jednou a člověk musí být schopen zreplikovat svoje předchozí kreslení.

Samozřejmě, že pokud člověk bude chtít, tak se tohoto může zbavit. Na každé platformě jinak, ale v obou to jde.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Asi mi nerozumíte, zkusím to tedy říct jinak. Standardně si WPF vše co nakreslíte pamatuje, ve Windows Forms je nutné pamatovat si pouze data, ze kterých se kreslí. Ve WPF se to tedy zbytečně udržuje 2x.

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

No ale ve WPF ty data pak můžete zahodit, protože prostě víte, že už se nikdy nezeptá na to, aby jste mu ty čáry zadal znova. Je to jen o tom, kdo si to bude pamatovat (ačkoliv třeba s nějakým overheadem).

A jak říká Tomáš, tak to není jediná možnost, jak ve WPF malovat čáru.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Co je to za blbost? A co když se ty data dynamicky mění a je třeba je překreslovat při každé změně?

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

A co když se... nebylo zmíněno. Proto jsem tu psal, že strašně záleží co aplikace dělá. Pokud se data mění, tak stejně nejvhodnější je použití DirectX.

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

Skutečně co odpověď, to perla. Vůbec není vhodnější použít DirectX, ten je vzhledem ke své komplexnosti vhodnější použít pouze v případech, kdy se to skutečně vyplatí (3D grafika). Už nic dalšího raději nepište.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Pokud jste nikdy neprogramoval nic co výkonově narazilo na hranice WinForms či WPF, tak chápu, že jste se s DirectX nesetkal. Ale pokud potřebuji něco opravdu rychle vykreslovat, tak je to jasná volba.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Toto rozhodně není nic co by bez problémů nezvládlo Windows Forms a pokud na něco takového chcete vytahovat DirectX, který tu neustále omíláte tak to svědčí jen o tom, že jste si o něm někde přečetl pár základních informací a nic skutečného v něm nenapsal.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Já pořád nevím odkud berete tu informaci o jakou aplikaci se jedná, napsal, že prováděli nějaký test a že budou potřebovat vykreslovat čáry, kde bude záležet na rychlosti. A to, že záleží na rychlosti je strašně relativní. DirectX jsem tu zmiňoval proto, aby autor tématu vzal v potaz i tuto možnost, pokud budou potřebovat větší rychlost, než jim nabízí WinForms či WPF. Ale souhlasím s vámi v tom, že nejspíš to potřebovat nebudou. S největší pravděpodobností jim totiž bude výkonově stačit i WPF, pokud se bude používat správně, ale z toho co napsal to rozhodně nejde poznat.

A ad váš osobní útok, tak se mýlíte, ale to je mimo téma, tak se zkuste držet tématu.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Je uplně jedno o jakou aplikaci se jedná, i kdyby se v ní skutečně vykreslovalo těch 100 000 čar, pořád bude stačit Windows Forms, navíc se zde nepracuje s žádnými 3D objekty takže DirectX a WPF je zcela mimo mísu. Nehledě na to, že na tyto dvě technologie je potřeba mít určité další know-how.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Rozhodně bych tohle netvrdil na 100%, u stovek tisíc čar bych se už pomalu začínal hádat. To máte pro každou čáru PInvoke, což už nějakou režii má. U DirectXu poskládáte vertexbuffer, což je jen naplnění nějakého pole floatů nebo struktur, a řeknete, ať z daných bodů vykreslí čáry, což je jen pár volání. Grafická karta to vykreslí všechno najednou a rychle, protože je na hromadné oprace optimalizovaná (vykreslovat LineList nebo LineStrip umí, není omezená jenom na kreslení trojúhelníků).

V okamžiku, kdy by bylo potřeba s těmi čárami hýbat a nějak je animovat, tak jste na tom s WinFormy daleko hůř.

Jestli je to 3D nebo 2D skoro nehraje roli, vzhledem k tomu, že v mnoha případech se 2D grafika vykresluje jako kdyby to byla 3D grafika, protože je to prostě díky optimalizacím karet rychlejší.

Nicméně dokud to nemáme podloženo nějakým měřením, tak se tady můžeme jenom hádat a nikam to nepovede.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Záleží co přesně budete chtít s těmi čarami dělat. A co bude v aplikaci dalšího kolem těch čar. Obecně WinForms bývá o trošku rychlejší, ale WPF o mnoho pohodlnější (u vykreslování čar tuto pohodlnost nejspíš nevyužijete, pokud nereprezentují nějaký model).

A mohu se zeptat, jak jste měřil rychlost vykreslování?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nemám v práci zdrojáky ale myslím že cez Environment.TickCount. Jednalo sa mi len o porovnanie rýchlosti medzi týmito platformami, na jednej - dvoch desatinách sekundy nezáleží ale keby tam bol väčší časový rozdiel napr. 1s to by už bolo zaujímavé.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Na měření jak co trvá dlouho se zásadně používá přesný System.Diagnostics.Stopwatch.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No já jsem se myslel především to, co jste měřili a ne, jak jste měřili, to vidím v tomto případě jako daleko větší problém.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Údaje boli vygenerované do datatable ktorej obsah som cez for next a DrawLine vykreslil na zobrazovaciu plochu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Samozrejme nemeral som dĺžku generovania údajov ale len dĺžku trvania slučky For Next.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Problém je, že ve WPF tím neměříš čas strávený vykreslováním. I když to měříš v renderovací metodě, kde "kreslíš" na kontext, tak on to nekreslí, on si pouze ukládá instrukce pro budoucí vykreslení. To je rozdíl od WinForms, kde maluješ dost podobně stylu WinAPI, tedy přímo do bitmapy, která se zobrazuje.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Prepracujem na Stopwatch a znovu urobím merania...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Aby som to upresnil - program by mal robiť iba 2D zobrazenie nič 3D, zobrazovať sa budú čiary tých je najviac, nejaké texty tých je počtom oproti čiaram cca 10-20%, v malom počte nejaké oblúky, prípadne kružnice. Užívateľ bude mať možnosť pridávať nové prvky mazať jestvujúce a meniť jestvujúce prvky (farba, hrúbka typ čiary, u textov font, farba a podobne...). Všetko sa bude musieť dať načítať a uložiť, prípadne vytlačiť. Samozrejme iba málo sa pracuje tak že sú všetky prvky zobrazené naraz na obrazovke. Údaje sú zobrazované v nejakej mierke a pri kompletnom zobrazení údajov sú aj tak nečitateľné, čiže si zväčším nejakú malú časť s ktorou pracujem. Približovanie a vzdaľovanie mám urobené na koliečko myši a dá sa zvoliť podľa potreby.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Včera večer som sa rozhodol podľa rady p.Linharta že zostanem u Winforms a GDI+ aj vzhľadom k tomu že s WPF a Directx nemám žiadne skúsenosti. Meranie času som prerobil na Stopwatch ale časy sú aj tak približne rovnaké, len sa zmenšil rozptyl časov pri viacerých meraniach toho istého zobrazenia. Uvidím ako sa s tým bude reálne pracovať a potom prípadne skúsim niečo iné. Inak pri zväčšovaní kresby klesá postupne aj čas potrebný na prekreslenie, maximálne cca na polovicu napriek tomu že vždy prechádzam celú datatable a všetky úsečky posielam na Picturebox bez ohľadu na to či budú napokon viditeľné. Skúsim ešte otestovať prekreslenie tak že pri každej úsečke zistím či sa bude zobrazovať a len tie úsečky pošlem na picturebox. Len neviem či časová réžia tohto nebude napokon väčšia.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak přesně pro tuto aplikaci bych doporučil WPF. Doporučuji si přečíst tyto články: http://blogs.msdn.com/b/kaelr/archive/ta... .

Je to dle mého názoru přesně co hledáte.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Ano, i tady bych se k WPF přikláněl. V tomto případě se jednotlivé věci ve scéně přímo hodí mít reprezentované pomocí WPF objektů. A nebudete si sám muset psát funkce pro zjišťování, jestli nad tím objektem je myš atd.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ďakujem všetkým za rady, ale asi zostanem u Winforms. Tie stránky sú veľmi zaujímavé, ale s úrovňou mojich znalostí o WPF by som to asi nezvládol. Zdrojov o WPF kde by sa dalo niečo naučiť je v porovnaní s VB minimum aj to väčšinou v štýle úplného začiatočníka a knihu v slovenčine alebo češtine sa mi podarilo nájsť "až" jednu - Mistrovství ve WPF s príkladmi v C#. Neviem koľko ľudí v skutočnosti programuje vo WPF ale zaujímavé je že diskusné fórum na vbnet.cz k WPF je úplne prázdne.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Protože se to prakticky vůbec nepoužívá, existuje minimum případů kdy by se to skutečně hodilo a využilo. Klidně zůstaňte u Windows Forms a na WPF zapomeňte.

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

Diskuse o WPF na tomto webu jsou úplně prázdné, protože založeny byly teprve nedávno a nemáme zde o WPF jediný článek, takže se na to lidi neptají.

WPF se, ať už pan Linhart tvrdí cokoliv, používá, ale je to oproti WinForms relativně nová technologie a firmy mají dlouhou setrvačnost, takže teprve teď si začínají všímat toho, že existuje WPF a Silverlight.

Ještě v roce 2007 se mnoho lidí bálo používat .NET, že prý není všude nainstalovaný a že by s tím byly problémy, a to bylo prosím 6 let od první verze.

Pokud mohu doporučit knihu o WPF, tak jedině Applications = Code + Markup od Charlese Petzolda. Lépe napsanou publikaci najdete jen velmi těžko, v češtině se obecně nedá použít skoro nic. Pro naučení se WPF je dobré též navštívit web http://www.xaml.cz.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Netvrdím že se nepoužívá (ani jsem nikdy netvrdil), ale používá se tak minimálně, že to ani nemá cenu zmiňovat. Zatím drtivá většina Windows aplikací by klíčové vlastnosti WPF vůbec nevyužila. Rovněž je nutné brát v potaz dobu, za jakou by se vývojáři naučili s WPF pracovat stejně dobře jako s Windows Forms.

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

Protože se to prakticky vůbec nepoužíváNetvrdím že se nepoužívá (ani jsem nikdy netvrdil)

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

Nepochopil jste, nevadí. Možná příště.

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

To "Mistrovství ve WPF" je od toho istého autora - možno je to tá istá kniha, žiaľ neviem porovnať.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ta samá kniha to nejspíš není, možná je to jinak přeložený název. Ale obecně české překlady spíše nedoporučuji.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Je to ta samá kniha, je to hodně zajímavě přeložený název. Ale také bych doporučil spíše anglickou verzi.

Jinak co se týče učení WPF, tak také doporučuji si projít Petzolda, tím získáte hrubé základy XAMLu a WPF obecně. Akorát mám z té knihy takový dojem, že by člověk pak začal programovat hodně podobným stylem jak byl zvyklý ve WinForms a to je špatně. WPF se krásně používá na návrhový vzor MVVM, přičemž podle něj můžete programovat jednak sám a nebo využít již hotový framework, například Microsft má na codeplexu framework Prism - jsou tam k němu i články, které vysvětlují jak funguje a jak ho používat. Pokud se naučíte i toto a uplatníte to v projektech, tak už se k WinForms nebudete chtít vrátit. A pana Linharta, o tom, že se WPF skoro nepoužívá, neposlouchejte. Probíhá migrace projektů do WPF ve spoustě firem a u nových projektů bych si již dovolil tvrdit, že je WPF ve většině.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback