1

Téma: vykreslovani mrizky ve Windows Vista

Stala ze zvlastni vec, dostal jsem novy PC (Intel 3GHz, win Vista), mnohem rychlejsi nez kterekoliv predchozi, na kterych jsem provozoval Formicu, a nikdy se mi nestalo ze bych musem cekat 1 az 3 sec nez se prekresli mrizka. Ve schematu s tim problem neni.
Dokonce ani necekam tak dlouho na prekresleni vylite medi. Zato se ale rapidne zpomalila mrizka, toz ztezuje praci vice.
Tusim zradu v ovladacich pro graf.kartu, ale i to jsem zkousel bezvysledne resit.
Vrta mi to co muze tak zpomalovat jednoduchy proces, a chci se zeptat jak mate resene vykreslovani mrizky, jak slozity je kod (predpokladam ze tam to zadna veda neni, zobrazit body dle x a y pozice s nejakym stepem, mam pocit ze ani nejake funkce jako xorovani apod.tam neni).

2

Re: vykreslovani mrizky ve Windows Vista

Kód pro vykreslení jedné řádky rastru vypadá takhle

GridDotX := MinGridX;
repeat
  SetPixel (CurrentHandle, ScreenX (GridDotX), y, CurrentColor);
  Inc (GridDotX, GridStep);
until GridDotX > MaxGridX;

přičemž SetPixel je funkce přímo ve Win32.

Možná by stálo za pokus změnit stupeň grafické akcelerace (ale to jste asi už udělal).

Jen ještě pro jistotu:  Užíváte skutečné rozlišení monitoru, anebo je nějak emulované?

3

Re: vykreslovani mrizky ve Windows Vista

hm, tak to je fakt divny...
akceleraci mam standartne maximalni, resp.nemam moznost to zmenit. Pouzivam a pouzival jsem i predtim dva monitory v rozliseni 1600 x 1200 a 1280 x 1024, v jejich nativnim rozliseni, nic nestandartniho nemam..
Nicmene to vypada skutecne na problem windows nebo ovladace..
Zase na druhou stranu spousta jinych prvku kreslenych carou se vykresli mnohem rychleji (viz. to vyliti). Schvalne si s tim SetPixel, pokud bude o vikendu cas, pohraju a v pondeli necham svou aplikaci neco vykreslit, uvidime. Necham zmerit cas vykresleni pri SetPixel a pak to jeste zkusim resit pomoci kresleni cary se shodnou pocatecni i koncovou souradnici...(i kdyz je nepravdepodobne ze to bude rychlejsi, ale mozne je vse..)

4

Re: vykreslovani mrizky ve Windows Vista

Tak vysledky jsou zajimave. Odzkousel jsem to podle receptury nize, tehoz sem dosahnul i s funkci do..loop (obdobna pascalovskemu Repeat).
S pouzitim Pset (cili SetPixel) se cas pohybuje mezi 60 az 120ms pri gridu 100. Pouziti Line bylo opravdu zcestne, tam je to kolem 270ms. Nicmene Formica s SetPixel ma mezi 700 az 1500ms pri stejnem gridu..

For Ypos = 0 To ScreenHeight Step GridSize
For Xpos = 0 To ScreenWidth Step GridSize

PSet (Xpos, Ypos), CurrentColor

Next Xpos
Next Ypos

5

Re: vykreslovani mrizky ve Windows Vista

Prosim vyzkousejte toto: www.formica.cz/files/forum/Grid.zip (stačí klikat do plochy a případně měnit rozměry okna).

6

Re: vykreslovani mrizky ve Windows Vista

Pro srovnání: Testováno na tři roky starém NTB DELL D800, WinXP, CPU Intel M 1.7GHz, 1G RAM, 128MB NVIDIA GeForce FX Go5650, rozlišení 1920 x 1200 a při apliakci přes celý monitor se pohybuji okolo 330ms
PS. Jaké máte kdo nastavení počtu barev (Kvalita barev)? V mém případě je to 32bitů.

7

Re: vykreslovani mrizky ve Windows Vista

Já tady mám hodně starou NVIDIA RIVA TNT2 64, rozlišení 1280 x 1024, taktéž True Color čili 32 bitů, procesor Duron 1,2 GHz.   Vykreslit 138450 bodů mi trvá cca 180 ms (ono to měření času stejně lepší rozlišení než 10 ms nemá).  Protože Layout potřebuje bodů rastru zhruba o řád méně, tyhle časy na mne nečiní dojem, že bych měl hledat cesty, jak kreslení bodů urychlit.  Pro zajímavost jsem si dal odečty času přímo do programu, a např. pro vykreslení gridu 0,635 mm ve zvětšení 30% potřebuji nějakých 30 nebo 40 ms.

Obecně ale existují nejméně dvě cesty, jak body kreslit rychleji, než to umí windowsovská funkce SetPixel:
1) Užívat DirectX.  (Tak je patrně udělaný např. CirCAD, v němž právě grafika dělá docela sympatický dojem.)  Postupoval bych asi stejnou cestou, kdybych opravdu potřeboval výkon grafiky zvýšit. 
2) Pan Kolínský si test zřejmě napsal ve Visual Basicu.  Nevím, co je v jeho útrobách, ale vzhledem k tomu, kdo je jeho původcem, je docela myslitelné, že píše přímo do paměti grafické desky.  V takovém případě by nebyl žádný problém dosáhnout téměř zázračných rychlostí vykreslování bodů.

V konkrétním případě by se ale pan Kolínský mohl spíše podívat, zda na počítači nemá instalováno něco navíc.  Do archivu www.formica.cz/files/forum/Grid.zip jsem teď přidal i zdrojové texty, takže s nimi případní zájemci mohou experimentovat po libosti (asi je přeloží i C++ Builder).

8 Naposledy upravil: kolin (2007-08-28 07:59:07)

Re: vykreslovani mrizky ve Windows Vista

Problem se podle vseho vyskytuje pouze na systemu Win Vista.
Cas na vykresleni bodu v demu je 5435ms/198809dots/1600*1200pixels.
Pan Ivo Löffler me svym prispevkem ovsem privedl na napad snizit pocet barev z 32bit na 16bit, coz by take mohlo zrychlit. Zrychlilo se to asi o
polovinu, ovsem at delam co delam, kresli mi to jen skupiny bodu ve svislych pruzich, na sirku jich mam 6 :o)) V samotne Formice to ale kresli
spravne. Stejne by to bylo pouze provizorium..
Zkousel jsem jeste kreslit pomoci SetPixel (volaneho pres API, ve VisualBasicu je Pset pry volan pres DLL) a takto se mi to vykreslilo jeste
temer 2x rychleji nez s Pset.
Ale bavil jsem se o tom s kolegou, ktery pro nas pise v Delphi, a zkousel se v tom vrtat.

Zatim ma pocit, ze pokazde, kdyz se vykresli bod, zarizeni celou obrazovku prekresli.
Teoreticky se tomu da predchazet vykreslenim nejprve do pameti a to cele se potom najednou zobrazi, nebo zakazat prekreslovani po kazdem zapsani bodu. Kolega zjistil, ze kdyz si to tedy nejdriv vykresli do bitmapy, a tu pak "swapne" na form, tak kresleni do bitmapy trva pry okolo 250ms.
Ale nevim, tak moc do toho nevidim, pouze jsem kolegu priblizne citoval. Bohuzel ted uz nema moc casu se tomu venovat, snad az odpoledne.

9

Re: vykreslovani mrizky ve Windows Vista

Ještě mě napadlo (ke konfiguraci PC)  Intel na 3GHz - to je relativně starý procesor 925, nebo něco z nejnovějších DualCore či nějaká jiná mutace (Xeon, Celeron)? Nepoužívá se tam sdílená RAM pro grafickou kartu?

10

Re: vykreslovani mrizky ve Windows Vista

Ne ne, bylo to zkouseno na vice PC, a vsechny s Vistama to kreslily pomalu..

11

Re: vykreslovani mrizky ve Windows Vista

kolin napsal:

Cas na vykresleni bodu v demu je 5435ms/198809dots/1600*1200pixels.  (...)  Zatim ma pocit, ze pokazde, kdyz se vykresli bod, zarizeni celou obrazovku prekresli.

To by ale znamenalo přenést za tu dobu asi 1,5 TB čili 280 GB / s, což není technicky možné. 

Odhlédneme-li od toho, dalším důsledkem by bylo, že změřené časy by rostly zhruba se čtvercem plochy okna.  Pozorovali jste něco takového?

12 Naposledy upravil: Ivo Löffler (2007-08-29 11:43:45)

Re: vykreslovani mrizky ve Windows Vista

Tak jsem udělal test na našem zatím jediném PC s o.s. Vista  a naměřený čas je 840 ms na analogovém výstupu a 550ms na digitálním výstupu.  Sestava DELL PE SC440 PENTIUM D 925, 3.0GHZ/2X2MB 800, 2GB RAM , duální grafika Radeon 9250. Rozlišení obou 1600x1200.

13

Re: vykreslovani mrizky ve Windows Vista

Kolik bodu jste kreslil pri 840ms, pane Löfflere? Efekty jste mel zapnute? Procesor je dvoujadrovy? (Intel tvrdi ze ano)

Mimochodem je zajimave, ze kdyz povypinam veskere efekty, vyhlazovani a animace, tak se to obcas vykresli za minutu, obcas za 3sec.,
ale vzdy to kresli jen v pruzich. Formica kresli normalne a zhruba o polovinu rychleji.

Nicmene tady jsou parametry testovanych sestav s Vistama:
Pentium 4 3GHz, RAM 2GB, Vista 32bit, Nvidia Geforce 7600 GT (1600 x 1200 DVI + 1280 x 1024 DVI)
    5109 ms/198809 dots
    2343 ms/ 98099 dots
    1281 ms/ 52065 dots
     360 ms/ 15120 dots
    ted jsem okno roztahl pres obe obrazovky, pricemz zcela pokryta je ta mensi:
    7000 ms/311958 dots

Pentium 4 3GHz, RAM 1GB, Vista 32bit, Nvidia Geforce 7300 GS (1280 x 1024 DVI)
    4702 ms/138024 dots
    2078 ms/ 57084 dots
     337 ms/  9400 dots

Dale, dopsal jsem narychlo svou utilitku tak, ze testuje prikaz Pset a SetPixel, a jeste kazdy dvema zpusoby:
tlacitko oznacene "DO" provadi obdobny zpusob jako demo p.Horskeho, ve Visualbasicu znaceny jako DO...LOOP, Delphi to ma DO..WHILE
tlacitko oznacene "FNXT" jde zpusobem FOR...NEXT, kdy po celou smycku muze byt proces prerusovan interupty, a ostatni programy i system
    ma svuj dil procesoru k dispozici (VisualBasic, nevim jak je to v jinych jazycich)

Prvni zpusob DO...LOOP tedy kresli v kuse, neexistuje aby si program na chvili odskocil napriklad do timeru a valna vetsina procesoru
je v tu chvili pridelena programu. Domnivam se, ze jakykoliv prikaz se ve smycce provede, tak se ceka nez ho system zpracuje a pokracuje dal, az teprve kdyz je prikaz splnen systemem. Behem cekani na system ovsem stale zabira vetsinu procesoru a system a fakt netusim co pritom dela)
Ovsem system ma tak malo casu procesoru, ze mu to zpracovani trva dele, i veskere aplikace se zpomaluji.

To co jsem ted nastinil: ze do...loop vytezuje procesor vice, je jasne. Proc tomu tak je, se pouze domnivam a prijde mi to nejpravdepodobnejsi
z toho co jsem kdy vypozoroval (Win2000 az Vista se to vzdy chovalo stejne). Pokud se v necem mylim, opravte mne.

Take bych si z celeho vydedukoval, ze kdyz smycka zahlti procesor, win pouzije druhou cast dvoujadroveho procesoru. Bohuzel, sestava naseho programatora, ktery je ted pryc, by mela byt velice vykonna (ten se neosidi), a mel by mit dvoujadrovy procesor ale kresli to uplne stejne pomalu.
Tudiz je mi stale zahadou ten namereny cas 840ms...

a tady je ta utilitka:
http://kolin.pointclark.net/temp/FormicaGrid.exe

Schvalne zkuste vzdy tlacitka jedne funkce ale rozdilnou smyckou a pozorujte cas na vykresleni. Body se nevim proc nevykresluji online ale to jsem ani neresil, a kreslim primo na form.

14

Re: vykreslovani mrizky ve Windows Vista

1. Použil jsem program pana Horského.
2. Ten VB má nějaké mouchy, na NTB mi při nějaké prvotní změně parametrů svalil a chtěl poslat echo Microsoftu o neplatné operaci. Jen doplním, že jsem na spuštění a hraní s ním měl jen chviličku.
3. Kde se zjistí, jaké efekty mám zapnuté - s Vistou jsem si ještě nehrál. Počítač, na kterém je provozujeme běží jako součást dohledového systému, takže na něm nemohu provádět žádná velká kouzla - jen mě prostě zajímalo, jak to kreslí u nás.

15

Re: vykreslovani mrizky ve Windows Vista

1.ano, a form byl pri testu predpokladam maximalizovany..
2. VB myslite predpokladam mou utilitku...to je moc divne, nic specalniho tam neni, vsude mi to beha jak ma. Kdyztak to jeste zkuste kdyz bude cas, zajimaly by me i jednotlive vysledky..
3.ovladaci panely / system / tlacitko "upresnit nastaveni systemu" / zalozka "upresnit" / prvni tlacitko "nastaveni" v sekci "vykon"

16

Re: vykreslovani mrizky ve Windows Vista

Kolega napsal priklad pro kreslenni pres tzv.Double Buffer, tedy nakresli si to do pameti a tu nasledne celou loadne na objekt.
Jsou to zdrojaky i exe.

http://papouch.com/users/hroch/gridwithdoublebuffer.zip

Zaroven mi velmi strucne popsal problematiku:
Problem je skutecne ve Vistach, ktere pouzivaji DWM, Desktop Window Manager (ve spravci uloh bezi jako dwm.exe). Ten dela to, ze
kazde okno, kazdy form prevede na bitmapu, kterou posle grafice, a ta bitmapu teprve umisti, vykresli, stiny, rozmazavani, velikost,
pruhlednost a vsechny dalsi efekty.
Pokud kreslime takovym zpusobem, kdy vykresleny bod se ihned zobrazi, musi DWM opet vygenerovat bitmapu a tu poslat grafice. Pan Löffler
ma zrejme veskere efekty vypnute a chova se to jako Win XP, pripadne Win2000.

Pane Horsky, zkuste toto prosim implementovat do Formicy zatim na mrizku, uvidime co to udela. Mozna by toto pak mohlo zrychlit i ostatni kresleni.

17

Re: vykreslovani mrizky ve Windows Vista

Rekapitulace Windows Vista Business 32-bit, grid 5, rozlišení 1600x1200
DO PSET max 1140 ms
API SETP max  750 ms
FNXT       max  430 ms
API FNXT max  170 ms

Nastavení - Systém zvolí nejlepší nastavení pro tento počítač

Nový dnešní sw. 840 ms/890 ms

DWM v procesech běží.

Jen pro srovnání, hodnoty z výše popsaného NTB 720ms, 590ms, 210ms, 130 ms
Nový dnešní sw. max 430 ms

18 Naposledy upravil: krivka (2007-08-30 22:23:43)

Re: vykreslovani mrizky ve Windows Vista

Nemohli byste prosím provést obdobné testy rychlosti vykreslování mřížky ve Vistách také na schematickém editoru? Tam se totiž procedura SetPixel vůbec nepoužívá. Hlavním důvodem je zlepšení funkčnosti při provozu pod emulátorem Wine pro Linux.

19 Naposledy upravil: kolin (2007-08-31 08:29:59)

Re: vykreslovani mrizky ve Windows Vista

Ve schematu neni s rychlosti vykreslovani cehokoliv takovy problem.  Vidim sice jak se prvky kresli od spodu, ale do 500ms je vykresleno vse (schema elements total 377, components 57, pins 127)
Jak to vlastne mate resene Vy?

20

Re: vykreslovani mrizky ve Windows Vista

Používám dvojici příkazů MoveTo(X,Y) a LineTo(X+1,Y).

21

Re: vykreslovani mrizky ve Windows Vista

Zajimave, to bych rekl ze bude jeste pomalejsi.. Jestli to dobre chapu, tak se presunete na pozici a pak od toho mista kreslite caru...
Logicky vzato by to tedy melo byt rychle i v layoutu. Mohl byste pane Horsky prosim zkusit kreslit mrizku jak tim DoubleBufferem, tak zpusobem co pouziva p.Krivka?

22

Re: vykreslovani mrizky ve Windows Vista

Funkci SetPixel jsme původně užívali po řadu let ke dvěma věcem, jednak ke kreslení bodů rastru, jednak pro "začištění" exklusivního kreslení.  (Funkce LineTo totiž nevykresluje poslední bod, pokud je šířka čáry 1px, což je v Layoutu nejčastější případ.)  Tato funkce má jednu zajímavou vlastnost, sice nedokumentovanou, ale -- pokud je mi známo -- zcela konsistentní na všech Windows:  Respektuje režim kreslení, takže dovede např. XORovat.

Jenže ona to přesně vzato je spíše vlastnost jdoucí proti dokumentaci, protože ta říká, že pixel dostane barvu předanou jako parametr funkce SetPixel (odhlédneme-li od případného mapování na paletu), a vůbec nepředpokládá, že by stávající barva pixelu mohla hrát nějakou roli.  To se projevilo při spuštění Formiky pod Linuxem a emulátorem WINE, kde pak za pohybujícím se ukazatelem zůstávalo smetí (tvořené rozsvícenými a nikdy již XORováním nezhasnutými pixely).  Z toho důvodu jsme omezili užívání funkce SetPixel na případy, kde Pen.Mode = pmCopy.  Ze schematického editoru tak vypadla zcela, v editoru desky mohla zůstat právě jen v kreslení rastru.

Cestou nejmenšího odporu asi bude i poslední SetPixel nahradit kombinací MoveToEx / LineTo.  Než ji ale zařadím do programu, někdo by mohl změřit testy, které opět jsou v archivu www.formica.cz/files/forum/Grid.zip .  Přidal jsem tam tlačítko, které přepíná mezi různými metodami kreslení.  Grid se teď vykresluje 10x, aby měl časový údaj dostatečné rozlišení.

Na mých W2k SP4 se opuštěním SetPixel (resp. trochu rychlejšího SetPixelV) kreslení zpomalí cca o 10%.  To asi je přijatelná cena; více mi vadí bizarní způsob kreslení pixelu čarou vedoucí do bodu, kde pixel mít nechci, ale na druhé straně se tak o jednu redukuje počet funkcí, které z Windows využívám.

S kreslením skrz bitmapu v tomto stadiu experimentovat nebudu.  Bylo by třeba efektivně ošetřit nejen kreslení rastru do celého okna, ale také jen do clipping regionu.  Oproti tomu však jsou možnosti kreslení skrz bitmapu (které bylo v zásadě zavedeno kvůli tomu, aby neblikaly všelijaké animace) daleko širší.  Kdybych už čerpal další systémové prostředky vytvořením bitmapy, bylo by čistší je využít pořádně; k tomu bych potřeboval přepracovat celé grafické rozhraní, a pro to dnes už celkem nejsou důvody -- rychlost se zdá dostatečná nebo ji lze vylepšovat jinak.

23

Re: vykreslovani mrizky ve Windows Vista

zde jsou vysledky:

DOTS:        1988090
RESOLUTION:    1600*1200

SetPixel:    78375ms, CPU 80%
SetPixelV:    70516ms, CPU 75%
GDI MoveToEx:    69578ms, CPU 60%
Canvas MoveTo:    81063ms, CPU 75%
----------------------------------------
DOTS:        1422840
RESOLUTION:    1280*1024

SetPixel:    38328ms, CPU 60%
SetPixelV:    38609ms, CPU 55%
GDI MoveToEx:    37141ms, CPU 60%
Canvas MoveTo:    38500ms, CPU 55%

Takze s litosti v srdci oznamuji, ze MoveToEx/LineTo nema valny efekt. Muzeme zkusit jestli bude nejak vyrazneji znatelne kdyz se alespon mrizka ve Formice bude kreslit pomoci MoveToEx/LineTo, ale pochybuju, je to vicemene z blata do louze...
Prepsani graf.rozhrani se drive ci pozdeji nevyhnete, at uz v 4kove serii nebo v rozpracovane 5kove (jak vubec probiha?). Vzdyt to nemusite hned delat radikalne (i kdyz by to samozrejme bylo nejlepsi), porad lepsi nez nic. Zkuste zatim jen tu mrizku, ta jedina je na Vistach kriticka. A plnou praci bitmapu implementujte az do verze 5.
Doslo u nas k tomu, ze ve snaze zrychlit takove operace jako vylevani medi a prace s layoutem s rozlitou medi i bez ni a kvuli spouste dalsich veci jako  dosluhujici komponenty, firma poridila novy pocitac. A jelikoz se jiz nevyplati WinXP, byly zvoleny Visty. Vylita med je driv nez si nasypu kafe, prekreslena take, problem je ovsem ta mrizka. A tu pouzivam neustale. Premyslime o rozsireni o dalsi licenci, ted ovsem jen cekame jak se podari odstranit alespon tento problem s mrizkou, protoze dalsi pocitac bude take s Vistama. A brzy jiste nebudeme sami.

24

Re: vykreslovani mrizky ve Windows Vista

Aha, původně jsem měl z diskuse dojem, že se sch. editorem nemáte problémy díky jiné metodě kreslení.  Teď je vidět, že nebyly jednoduše proto, že grid jste tam neužíval tak hustý.  (Odtud by ostatně plynulo řešení problému ve stylu Mrtvá kočka:  Grid neužívat.  Popřípadě, Grid naředit.  Mimochodem, právě od toho tam také je parametr Graphics | Thresholds | Grid Step -- jím dosáhnete toho, že se grid sice zobrazuje, ale jen v některých bodech.  Prosím podívejte se na něj, jestli to vlastně není to, co hledáte.)

Chápu-li to teď správně, DWM se nemůžete tak jednoduše zbavit z toho důvodu, že užíváte dva monitory.  Těžko říci, proč nejsou u Vás výsledky srovnatelné s těmi Ing. Löfflera, ale nabízí se, že to bude také právě jimi.  Lze-li DWM nějak konfigurovat (a změní-li to něco), o tom nemám tušení.

Paradoxně by se kreslení asi podstatně zrychlilo, kdybych grid nekreslil jako uzlové body, nýbrž jako mříž.  (Kdysi, v dobách, kdy jsem si ještě mohl sám psát grafické drivery pracující až na úrovni videopaměti, jsem totiž grid udělal z bodů hlavně kvůli rychlosti kreslení, kterou tak šlo zvýšit řádově.)  Přidávat tam 8 MB bitmapy jen kvůli gridu (přesněji řečeno, jen kvůli gridu a Microsoftu) se mi vskutku nelíbí -- půjdu-li touto cestou, budu se snažit bitmapu využít nějak systémověji, abych se nemusel stydět; jenže to by zas chtělo trochu programování navíc.

Mimochodem, verze 5.x má překreslování výřezu řešené tak, že se část společná starému a novému přesune na obrazovce jako bitmapa -- mohu Vám něco poslat, a si rychlost této funkce zkusíte.

25

Re: vykreslovani mrizky ve Windows Vista

1. nejsem ing. (i když se to kdysi nějak prosáklo do licencí)
2. Testoval jsem:
monitor DELL 20" 1600x1200,  připojený přes analogový výstup, 2 041 390 bodů, hodnoty cca., zatížení procesoru u všech testů do 50%
SET       11350
V          11310
Win       11530
Canvas 11794

Druhý monitor, typově ten samý připojený přes DVI rozhraní (2 094 690)
6240
6020
6540
6430

A nakonec aplikace přes oba monitory (4 109 940)
15500
15500
15500
16000