Optimalizace v PDA (Compact Framework)

Za oknem léto. To každej musel zaregistrovat. Není tudíž mnoho času rozšiřovat maxigeniální myšlenky. Radši jezdím, cvičím, jím, spím a tak dále. Teď zpět k dnešnímu tématu. Několikátý měsíc, čistě pracovně, rozšiřuju svoje vědomosti o taje a zákoutí .NETího Compact Frameworku pro PocketPC alias PDA, MDA. O víkendu jsem vyvíjel novou knihovnu pro asynchronní připojení. Ta minulá byla trošku zrezlá. A když bylo dopsáno dostal jsem naprosto geniální nápad.

Vlastní dialog

Ano. Nápad byl vcelku prostý. Do skinovací knihovny přidám podporu pro vlastní dialogové okno. Samozřejmě zcela grafické. Znáte dnešní standard, na něco kliknete, celá obrazovka ztmavne a vyskočí dialog s nějakou fajnovou hláškou. Po odkliknutí to zase všechno odtmavne a jede se dál.

Úkol snadný, ne ovšem na velmi omezené platformě PDA. Tady neexistuje poloprůhlednost. Tady plno věcí neexistuje. První co jsem tedy vymyslel, byla jednoduchá FAKE aplikace, která měla předem připravené obrázky ztmaveného pozadí. Toto řešení má ovšem zásadní problém. Neumožňuje být jakkoliv flexibilní. A taky, pokud budu dialog volat odjinud, než jsem si předkreslil, nebude grafika souhlasit.

Řešení

Po nějakém tom pátrání v dokumentaci jsem pomocí PInvoke sesmolil funkci, která: sejme aktuální obrazovku PDA, uloží do bitmapy. Bitmapu potom pixel po pixelu přepočítá na “tmavé barvy” (prakticky snižuje saturaci a jas) a na tuto bitmapu doprostřed nakreslí obrázek již samotného dialogu – nějaký fancy rámeček s dialogem. Myšlenka geniální, po splácnutí preview dokonce i funkční, no bohužel smrtelně pomalá. Moje představa byla tuto operaci stihnout tak do 50-100ms. Jak dalece jsem se mýlil.


[MORE]

Optimalizace začíná

Nebudu to zdržovat. Celý proces trval neuvěřitelných 10 sekund. Za všechno mohl kód bitmap.GetPixel(x,y). A k němu reverzní SetPixel. Tyto neskutečně neoptimalizované funkce není radno používat. To už jsem věděl z dob programování grafických prvků v C++.

Zapátral jsem a od MVP lidí z MSDN jsem se dozvěděl optimalizační tipy. Základem je použít Bitmap.LockBits a UnlockBits. Tím se dostaneme přímo k nemanagované paměti bitmapy a můžeme začít řádit jak je libo. Výstupem je bajtové pole jednotlivých subpixelů(R,G,B). Pro rozlišení 240×320 je velikost pole nějakých 240*320*3=230400 pixelů. Toliko bodů je třeba nějakým způsobem zanalizovat a přepočítat (jas, kontrast, barevnost atd).

Bláhově jsem říkal, máš vyhráno. Celý proces se zrychlil na neuvěřitelných 180ms. Stačilo tedy napsat funkce na transformaci pixelu a bylo. Napsal jsem tedy vlastní RGB<->HSB transformační funkce. Sem se s nima patlal víc jak den, přetížené, patřičně okomentované, prvotřídní práce. V tuhle dobu jsem ještě netušil, že PDA je potřeba optimalizovat. Když jsem ověřil, že funkce fungují korektně, prostě jsem do smyčky s pixely vložil něco takového

ColorTransform.RGBToHSB(R, G, B, dH, dS, dB)
dB = dB * 0.4
dS = dS * 0.7
ColorTransform.HSBToRGB(dH, dS, dB, R, G, B)

Kód fungoval perfektně, výstupem bylo přesně to co jsem požadoval. Ale ouha. Transformace a násobení každého pixelu sežralo neuvěřitelných 5150ms. A tak jsem začal hledat, proč tomu tak je. Zakomentoval jsem tu část s násobením a hnedka jsem byl o pár sekund rychlejší. Už bylo jasno. Procesor v PDA stěží sčítá, natož násobí 32bit float číslo. A tak jsem přemýšlel dál.

Různá řešení

  • převést pixel na šedou a rozkopírovat do všech kanálů
  • vzít jeden kanál, dělením ztmavit a rozkopírovat do ostatních
  • sečíst všechny kanály a výsledek vydělit nějakým větším číslem
  • počítat jen sudé řádky/sloupce a výsledek rozkopírovat
  • počítat jen nutnou oblast, ostatní vynechat

Každý z těchto nápadů o něco a některé i slušně zrychlily vykonávání, ale stále jsem se pohyboval nad hranicí jedné sekundy a to bylo nepřijatelné. Musí se to počítat v reálném čase. Především výsledky s jedním kanálem vypadaly nadprůměrně hnusně. I to bych překousnul, jenže časy neodpovídaly.

No a tak jsem do noci seděl nad problémem, pořád si prohlížel hodnoty pixelu před ztmavením a po ztmavení a přemýšlel, jak tuhle hodnotu spočítat bez násobení, dělení, sčítaní. Jo a pak mě to samozřejmě trklo. Bitový posun. Není to přesné, nemá to moc možností, ale funguje to pekelně rychle kdekoliv. Tím jsem byl v podstatě hotov. Vzal jsem součet barev jednoho pixelu, shiftnul o 4 a rozkopíroval. 280ms. Super. Výstup cca dobrý.

R = (R + G + B)
R = R >> 4
G = R
B = R

Pak jsem zkusil ještě jednu úpravu a kupodivu, zrychlení a zlepšení výstupu. 255ms

R = R >> 3
G = G >> 3
B = B >> 3

Chybné cesty

Bitový posuv je tak rychlá operace, že i uvažované vynechání (nepočitání) určité oblasti, je pomalejší, než vše nechat přetáhnout posuven. Samotná režie na vyhodnocení, jestli pixel je v oblasti nebo není, je ohromná. To jsem dokonce procházení pole přepsal s doporučenými Int32 jakožto nejrychlejší možný datový typ. Počítání X a Y se samozřejmě musí provádět už v samotném cyklu nikoliv až pomocným výpočtem uvnitř cyklu. Ta režie je tak veliká, že ani vynechání všech pixelů nestačí na kompenzaci zpomalení. Tady by museli přijít taky nějaký optimalizace. Například rozdělit bitmapu pomocí BitBlt na více menším a ty zpracovávat. Nebo vyhodnocovat pozici pixelu jen občas :-/

Přikládám nějaký obrázky, jako ukázku, co je možné a za jakou dobu získat optimalizací. Rozhodně je při takových masových akcích dobře přemýšlet co a jak. Vyplatí se to. V mém případě nejde o přesné zobrazení, oko je blbý, takže je to v pohodě. Nedovedu si představit rychlost při tranformacích s maticí. Tady prostě neplatí běžná pravidla. A teď jsem dostal nápad na parádní prohlížeč obrázků :)

Reálné nasazení

Po doplácání algoritmu do mojí grafické knihovny, jsem vyzkoušel některý scénáře použití a ukázalo se to neskutečně nepoužitelný. Načtení dat z XML, vytvoření prvků, screenshot, transformace a vykreslení, to všechno zabírá víc jak sekundu času. A to je na kliknutí velká prodleva. Nakonec jsem to vyřešil vtlačením vrstvy mezi objekty. Tím se starám o cachování a preload dat. Ještě to bude chtít nějakou inteligenci pro preload. Takhle všechno zabírá moc ramky.

Život programátora, první díl

Dneska jsem se rozhodl napsat něco ze zákulisí mého pracovního procesu. Už nějaký ten rok dělám programátora pro britskou společnost. Jméno není dúležité, stejně ji u nás nikdo nezná. Takže si celý dny sedím v kanclu, datluju do kompu a při tom si všímám, že i tahle profese má určité zákonitosti, schválnosti.

[MORE]

#1

Když mám složitý problém, stačí zajít na záchod a řešení vždy vymyslím. Stačí vlastně odejít od kompu a nápady se sypou. Bohužel čím je menší pravděpodobnost, že si řešení poznamenáte, tím lepší řešení přichází.

#2

Těsně než usnu, vždy přijdu na řešení problému a nebo ještě lépe, vynaleznu novou a naprosto geniální funkcionalitu. Samozřejmě, že počítač už neběží a zvedat se taky nechci.

#3

A prozatím poslední objev. Vždy když mám v mozku geniální myšlenku, konstrukci, algoritmus, tak se mi chce děsně srát a prostě musím běžet na mísu. Čím větší myšlenka, tím větší nutkání. A na míse platí pravidlo jedna, takže většinou geniální myšlenka je ještě víc zgeniálněná :) a po příchodu ke kompu téměř nerealizovatelná.

Dodatek

Teď například dělám vlastní XML skin Loader pro Compact Framework v .NETu. Myšlenka byla na začátku jednoduchá. Mohl bych napsat nějakou pomůcku, abych nemusel komponenty naklikávat, ale mohl je dynamicky generovat z definičního souboru. Z toho se vyklubal XML soubor. Potom následovala myšlenka, že by těch souborů mohlo být více – jednotlivé obrazovky v PDA. Z toho už nebylo daleko ke skinování. Od toho rychle přisel nápad na podporu různých rozlišení a natočení podle skinu. To vše musí zaštitovat vlastní logovací a debugovací knihovna. Vracíme se k dynamickým komponentám. Ze začátku to byl obrázek na pozadí. Potom přišel klikací obrázkový buton. Následoval transparentní label, dynamický timer, textbox, klikací area. Vše završilo rozhraní pro registraci eventů pro callbacky při akci. Všechno se muselo promítnout v nastavení XML.

A tak z několikahodinové práce, je bezmála měsíc kvalitního kodérství. Vychrlil jsem užásné množstvé tříd a rozhraní. Celé to samozřejmě není u konce. Nápady stále přicházejí. Je ale jasné, že žádný projekt nevypadá na první (ani druhý, třetí) pohled tak veliký, jak ve skutečnosti je

Rychlost kočky

Experimentálním testem, jsem zjistil, že maximální rychlost k smrti vyděšené kočky, běžící po asfaltové silnici s mírným stoupáním <1% nepřekročí 35km/h. Tento test je platný pro zrzavobílou kočku a takochometr na mém kole

Kočku jsem protrénoval pekelně, ovšem co dneska ráno dokazovaly řidičky za volantem jsem zíral. Hned na první křižovatce od baráku mě málem při odbočování sundala felda. Já blbec ještě zastavím a dávám přednost odbočujícímu autu (mělo přednost) a najednou vidim jak si to řítí úplně na mě. Dobře to dopadlo. Ale adrenalin jak při sjezdu. A aby toho nebylo málo, ve městě mi do cesty vlítlo další auto. Řidička těžce ignorovala moji hlavní silnici. To nám to pěkně začíná.

Stavba terária

Rok se sešel s rokem a zvyšující teploty aktivovaly moje chovné kusy (pavouky). Zima byla docela krušná a občas se podivuji, že chudáci neumrzli. Když jsem zapomněl otevřené okno a teplota v místnosti klesla k deseti stupňům. Samozřejmě, že jsem neměl vytápěné krabičky. Po téhle zkušenosti jsem zavedl příhřev jedné strany krabičky tráfkem. Trochu to zvyšuje teplotu a má-li pavouk chuť přitiskne se ke stěně a může se ohřívat.[MORE]

Teď se vlastně celou zimu nesvlékali, nerostli, nežrali. Ale už je všechno v normě. A protože se jejich velikost začíná rapidně približovat limitu současné chovné stanice, rozhodl jsem se pro stavbu terária. Provedl jsem nějaký ten výzkum na internetu, jak asi má vypadat terárium a rozhodl se pro stavbu krychlového teréria o straně 25 centimetrů. Zadní strana bude na dvouch místech z děrovaného plechu pro vertikální proudění vzduchu, horní kryt bude v kolejnicích/lištách. Uvnitř jsem se rozhodl pro tvorbu jeskyně z polystyrenu. Po vytvarování se to celé opatlá hlínou a bude to vypadat věrohodně. Na dno přijde částečně lignocel a z části chci dát nějaký křemičitý písek nebo něco takového. A do písku větší balvan s dírou pro vodu. Do lignocelu bych chtěl nacpat nějaký ten příhřev.

Už jsem ve fázi slepené stěny, teďka mám trochu problém sehnat správný děrovaný plech. Šutr získám někde v lese a písek musím ještě pokoumat. Bude taky potřeba všechno desinfikovat hypermanganem, aby tam nerostly plísně. Potvory. A stavím zároveň dvě terárka najednou. Doufám, že do léta bude hotovo. Jediná fotka ze stavby ukazuje mistrnou práci se sklenářským tmelem :) :). A aby se neřeklo, přihodil jsem jednu čerstvější fotku B.Sabolosum.

oslava Dne Země

Nepochybuju, že jsem uplná lama, ale to co se mi stalo teďka na kole, převyšuje moje očekávání. Nedávno jsem se byl podívat jak bajková elita zvládá XC závod na Kunětické hoře. To vám povídám, mě to tak naladilo. Do toho ještě začalo svítit sluníčko, teplíčko a tak.[MORE]

Tak jsem si vyrazil na Kuňku, že teda vyzkouším jak se to má jezdit a projedu si pěkně trasu na plný pecky. Vše šlo hladce až do tý doby, než jsem se na schodech rozšlapal a bez výrazného brzdění jsem projel přes všechny schody. A pak to přišlo. Stačilo na posledním schodě nadskočit a pokračovat dál. Jo, ale to mi nikdo neřekl, že kurva se to rychle všechno hejbe, že nebude moc času na to naskočení. Takže jsem prostě poslední schod prvotřídně proletěl po předním kole. Z toho se rázem (kdo by to čekal) stalo salto. Kolo někam zmizelo a já místo prvotřídně provedého salta s dopadem na nohy jsem provedl takzvaný placák s dopadem na ksicht.

Naštěstí dost pochytaly brejle, takže jsem měl odřený ksicht od půlky nosu, rozsekanej ret a trochu bradu. Helma netknutá. K tomu ještě nějaké ty oděrky na rukách a nohách. Prostě luxus. V nemocnici mi to statečně (pro mě) očistili skalpelem a zašili. Hm. To už to bylo nechutně nateklý. Druhej den jsem zjistil, že mě bolí pěkně vzpřimovače kolem hlavy, takže jsem zhusta energii pochytal. Naštěstí žádná zlomenina. Na kole jsem polamal blatnik a decentroval zadni (nechapu) kolo. To bude fajn.

Musím si dávat pozor. Jezdit jako prase by se nemělo. Potom se člověk potká s fyzikálními zákony a … je vymalováno. Ksicht se mi oloupal. Celá tahle akce mě stála 90kč u lékaře plus nějakých sto penězí za centrování. Bolest – k nezaplacení – a taky nějaké ty zkušenosti.

Test: CF karty A-Data Speedy 2GB[ENG]Review: CF card A-Data Speedy 2GB[/ENG]

Dneska si dáme nějaký ten naučný článek, plný informací a poznatků. Bla bla. Koupil jsem jentak na zkoušku kartu Compact Flash A-Data Speedy 2GB. Zajímalo mě, jak je na tom nízkonákladový produkt z pohledu rychlosti.[MORE]

Protáhnul jsem kartu měření v HDtachu, SiSoft Sandrou 2007 a ultimativní utilitou hwBench v3.12. Grafy a výsledku jsou přiloženy. Co k tomu dodat. Karta je poměrně svižná při čtení a jako spouštěcí disk se dá použít bez větších obtíží. Benefit nízké přístupové doby je patrný. Zápis je ovšem věc smrtelná. Doporučuji nastavit maximální velikost sektorů pro alespoň symbolické urychlení. Velké soubory (mp3) už nahrává obstojně. Počet zápisů těžko odhadovat. Kartu jsem nerozebíral, abych se podíval co je uvnitř za paměťový čip.

SiSoft Sandra měření

[GRAPH||Rychlost (SiSoft Sandra 2007) |zápis (kB/s), čtení (kB/s)]
soubor 512B|soubor 32kB|soubor 256kB|soubor 2MB|soubor 64MB
17;1188|1835;9123|4335;9690|5666;10923|6554;10923
[/GRAPH]

hwBench v.3.12 měření

[GRAPH||hwBench v.3.12 |]
čtení|náhodná přístupovka|swapping|installing|Word|Photoshop|copying|F-Prot
10815{min. 10786 kB/s};10914{max. 10914 kB/s}|0,21{min 0,21ms};0,49{max. 0,49}|7640{7640 kB/s}|15331{15331 kB/s}|11300{11300 kB/s}|11108{11108 kB/s}|13069{13069 kB/s}|9740{9740 kB/s}|
[/GRAPH]

HDTach 3 graf rychlosti

HDTach a jemu podobné utility trdošíjně hlásili 10MB/s a ani o mego více. Mohu se domnívat, že to bude hranice karty. Asi rychlost řadiče. Karta byla připojená na IDE kanál a pracovala v DMA režimu.

Závěr

Podle výsledků testů je vidět, že karta není úplně špatná a ve spojení do raid 0 bude podávat naprůměrné výsledku za minimální cenu. Stejně tak bude dobrá pro spouštění portable aplikací. Nehodí se určitě na místa s častým zápisem.

[ENG]

Today, I was thinking of you and bought super cheap (about 15$/2GB) Compact Flash card Speedy 2GB by A-Data. I was wondering how this shitty card is quick.[MORE]

I make some tests with HDtachu, SiSoft Sandra 2007 and super-pimp utility hwBench v3.12. The graphs and results are around. The card is relatively quick in read operations. Writing is disaster. Do not use as write-disc! :) I didn’t disassembly the card so that I don’t know what chip is inside – would be better for more information.

SiSoft Sandra measuring

[GRAPH||Speed (SiSoft Sandra 2007) |Write (kB/s), Read (kB/s)]
file 512B|file 32kB|file 256kB|file 2MB|file 64MB
17;1188|1835;9123|4335;9690|5666;10923|6554;10923
[/GRAPH]

hwBench v.3.12 measuring

[GRAPH||hwBench v.3.12 |]
reading|random access|swapping|installing|Word|Photoshop|copying|F-Prot
10815{min. 10786 kB/s};10914{max. 10914 kB/s}|0,21{min 0,21ms};0,49{max. 0,49}|7640{7640 kB/s}|15331{15331 kB/s}|11300{11300 kB/s}|11108{11108 kB/s}|13069{13069 kB/s}|9740{9740 kB/s}|
[/GRAPH]

HDTach 3 speed graph

As you see, the HDTach says 10MB/s and no more. I think, 10MB/s is construction speed of the card. I tested card on IDE channel with DMA enabled.

Conclusion

The card is good for storage and read-only software. You brought lots of fun for some money. Raid 0 would be good. Never use in write-only apps.

[/ENG]

Zavírání cyklosezóny 2007

S koncem březence jsem zavřel starou cyklosezónu a počátkem dubna otevřel novou. Bylo na čase pohlédnout do minulosti a zhodnotit uplynulý rok. Nedávno jsem odhadoval, že stihnu do konce března najezdit deset tisíc. No tak se nestalo. Bez pár drobných jsem končil s devíti tisíci. To víte, byla zima. Víkendy pršelo nebo ještě hůř sněžilo a to se moc jezdit nechce. Takže jsem jen odjížděl do práce a zpět. V inverzi žádnej medík, spíš kafíčko.[MORE]

Těžko uvěřitelné, ale na kole jsem odjezdil víc než autem a ještě ke všemu na fullovi. To už je nadprůměrný hobby výkon. Vzorek pneumatik už je notně ošoupaný a není radno se pouštět do většího bordelu. Mohu jen vzpomínat na adrenolinové zážitky z Brna, okouzlující výjezdy na Seč a nebo každoroční družení bajkerů v Praze. Uff. Už aby bylo léto, teplo. Zima na bajku byla hnusná, ale zároveň jiná, zajímavá, občas kouzelná, občas k nasrání. Nějaký ty pěkný pády jsem stihnul. A opravdu musím potvrdit, že na zledovatělé silnici se jezdit nedá. Naštěstí všechny parakotouly byly perfektně provedené.

A jak se teďka zvedla teplota a začalo svítit, jooo, to mě to táhne ven. A letošní sezóna bude vyjímečná, lepší, rychlejší (jako reklama). Protože jsem zimu neproležel, mám parádní kondici a nemusím čekat do léta na formu. Forma bude ještě lepší než předtím. Takže jakmile dovolí počasí, udělám si z práce menší/větší výlet a obdivuju krásy bajkování. Od té doby, co mám na baťohu nášivku ČEMBA, je to ježdění o poznání lepší – placebo efekt. To mi celkově zvyšuje kondičku a kilometry jen naskakují. Ale za množstvím kilometrů se nežemu. To v žádným případě. Radši mám zážitky a novinky.

Víkendový maraton – první letošní

O víkendu jsem zabrousil do zcela neprobádaných končim. Podle mapy jsem si vytipoval modrou značku z Chrastě. Potom směr Hlinsko a vrátit se někudy kolem Manitou trasy. Do Chrastě jsem se dodrncal po silnici, pro zahřátí a pak to přišlo. Začalo to nenápadně takovou lesní širokou cestou. Tam mi byla sice zima, po převlečení a nakrmení jsem pokračoval dál. Široká cesta se začala měnit, klikatit lesem a nakonec jsem skončil na parádním, listím popadaném singlíku, který mě vystřelil až kamsi. Na fotkách jsem se snažil zachytit kvalitu. Moc se to nepodařilo.

Vše jsem zakončil párádní téměř horskou etapou modré značky, kde nebyla nouze o brod, semtam lávečka a průjezdy natěsno. Finále bylo ve sjezdu, který jsem sice nedal, ale až budou nové gumy, mlask. Byl jsem z toho tak moc pěkně naladěný, že zbytek dne jsem zasněně jezdil po krajině a přemýšlel, jak ten proklatý sjezdík zdolat. U vysílače na Krásným, jsem byl už prošitej a tak jsem zvolil směr domů. Manitou byl teda extra blátivý a dokonce nějaký prasata to tam rozjezdili traktorama, tak to bylo něco. Občas to vypadalo, že utopím kolo. Ale nestalo se. S prvotřídní vrstvou bláta jsem se prohnal Pardubicema a zamířil k domovu. Tachometr zaznamenal 106km za necelých 6 hodin. Doma jsem úplně vychcípnul. Už se těším na další výkend, až tam zase vyrazím.

Změna (e)Banky – dokončení

Tenhle blogspot bude stejně krátký jako jeho první část. K dokončení přesunu od eBanky zbývalo jen zajít na pobočku a podepsat ukončovací papíry. Když už jsem neuvěřitelně krvácel při rušení trvalých plateb. Aktuální ceník za zrušení jednoho trvalého příkazu požaduje 30kč. Hajzlové. Tak jsem teda zašel. A musím říct, že člověk musí být hodně klidný a naprosto pohodový člověk, jinak si bude připadat jako by zrovna vraždil celou rodinu. Přesně takové pocity ve mě vzbuzovala bankéřka, když jsem jí s úsměvem nahlásil, že končíme :)[MORE]

To najedou měla keců kolem nízkých cen, a že tohle a támhleto. A pak smrtící otázka, proč odcházíte? No proč asi, ty krávo blbá. Protože jste drahý. A že kdybych si zvolil jiný “tarif”, mohl jsem mít všechno zdarma. Aha, tak proč mi to řiká až teďka a neudělali mi to na účtu automaticky. Stále jsem flegmaticky opakoval, že končíme. Tak paní začala klikat. Kontrolovala různá nastavení, rušila cosi a cosi. No a po půl hodině jsem odcházel s papírem potvrzující zrušení karty, účtu. A to je konec jednoho příběhu. Do budoucna si odnáším jednu velkou zkušenost. Nikdy nezůstávat u jednoho podniku příliš dlouho. Všechno se dřív či pozdějc posere (rozumněj – zkostnaní).