Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Pomoc s optimalizací kódu v delphi7

Dobrý den,

chci požádat o pomoc s optimalizací kódu pro Delphi7.

Program je sestaven jako simulátor železniční stanice. Šedé obdélníky se nazývají průsvitky a jsou prosvětleny žárovkou, jejich stavy jsou šedá-kolej volná, bílá-kolej po níž pojede vlak, červená-kolej na níž už vlak je. (nevypisuju podrobnosti žel. provozu). Pokud výpravčí zmáčkne tlačítko kontrola polohy výměn, dojde na panelu k rozsvícení těch průsvitek které značí výhybky a svítí bíle do těch směrů, kam směřují výhybky. Panel který ovládá stanici má ruznou velikost a také různý počet průsvitek. Největší mě známý panel má 10 sekcí o velikosti 0.75metru, počet kolejí 35 (řádků) a v každé koleji muže být až 21 průsvitek (sloupců). Což je již enormní množství.

A ted k programu.

Na začátku si vykreslím průsvitky do pole (abych měl každou samostatně a mohl s ní pracovat). Konkrétně takto. Program je uložen v tlačítku btn1.

ind:=0;                                       //nastavení indexu na 0
  setlength(obr,2059);                        //velikost pole bude 2059 prvků

  for y:=0 to 48 do begin                     //řádky
    for x:=0 to 41 do begin                   //sloupce
      obr[ind]:=TImage.Create(form1);         //vytvoření za běhu
      obr[ind].Parent:=form1;

      obr[ind].Left:=x*43;                    //souřadnice a parametry
      obr[ind].top:=y*6+24;
      obr[ind].picture:=img1.Picture;         //obsah prvku se kopíruje z img
      obr[ind].AutoSize:=true;                //na formuláři
      obr[ind].hint:=inttostr(ind);
      obr[ind].ShowHint:=true;
      obr[ind].Transparent :=true;
      form1.DoubleBuffered:=true;             //zamezení blikání při vykreslení
      ind:=ind+1;                             //index prvku se zvětšuje o 1
    end;
    application.ProcessMessages;              //abych viděl že kreslí
                                              //nemusí se použít
  end;
  max:=ind;                                   //velikost pole se muže měnit,
                                              //hodnota max udává nejvyšší
                                              //použitý prvek, to pro případ že
                                              //se použije méně prvků než je
                                              //a pak by funkce high nedávala
                                              //správný výsledek

A ted to nejdůležitější:
Překreslení šedých průsvitek na bílou. Na formuláři jsou tři image a každý obsahuje příslušně barevnou průsvitku.

Protože se jedná o pole a chci jej překreslit celé, tak se jako nejjednoduší jeví použít smyčku FOR. To se provede po stisknutí tlačítka btn2.

for i:=0 to max-1 do begin                    //smyčka for i
    obr[i].Picture:=img2.Picture;             //nastavení obrázku v poli na
                                              //img2, kopírováním
end;

Problém tkví v době vykreslení. V reálném provozu se ty průsvitky rozsvítí ihned, v programu k tomu dojde až po více než 2 sekundách, což ovšem snižuje kvalitu simulátoru. Ty 2 sekundy jsou moc.

A dotaz na optimalizaci zní:Jak to udělat aby se celé pole o velikosti alespon 2059 obrázků překreslilo tak rychle, aby vjem byl že se průsvitky rozsvítí naráz. Tzn. zkrátit dobu na aspon 300-400milisekund. To už je takové hraniční kdy prodleva ještě není tak výrazná.

Předem děkuji za rady.

Předmět Autor Datum
A je opravdu nutne pouzivat Image? Prirazovani do Image ma hodne velkou rezii. Mnohem efektivnejsi b…
Jan Fiala 29.05.2016 12:05
Jan Fiala
Vypadá to takto: menší obrázek ukazuje polohy výhybek v menší stanici a jen na zhlaví (stavědle), še…
Persink163054 29.05.2016 12:43
Persink163054
Po registraci můžeš vkládat obrázky na poradnu.
ws79 29.05.2016 12:52
ws79
A nejde mi ani načíst video. Takže na ukázku jak to funguje hledejte na youtube:Relay interlocking…
Persink163054 29.05.2016 13:02
Persink163054
Ten odkaz na video ti nefunguje. Zkus pouzit TShape, nastav si tvar dle potreby (obdelnik na koleje…
Jan Fiala 29.05.2016 13:47
Jan Fiala
Odkaz na video mi funguje, jen se nenačítá, protože mám GPRS (občas i 3G). Nápad s TShape je jistě…
Persink163054 29.05.2016 20:53
Persink163054
Pak je moznost pouzit PaintBoxy a klidne to vykreslovat pomoci gradientu. Informace pak budes udrzov… poslední
Jan Fiala 29.05.2016 22:08
Jan Fiala

A je opravdu nutne pouzivat Image? Prirazovani do Image ma hodne velkou rezii.
Mnohem efektivnejsi by bylo pouziti treba Shape a nastavovat Brush.Color
Dalsi moznosti je PaintBox - nastavit mu TAG a v jeho udalosti OnPaint pak vykreslit co potrebujes.

Zkus sem dat aspon kousek obrazku, at mame predstavu, jak to vypada.

Vypadá to takto:
menší obrázek ukazuje polohy výhybek v menší stanici a jen na zhlaví (stavědle), šedé jsou volné, bílé ukazují kam směřují konkrétní výhybky, červená znamená že tam stojí vlak.

Druhý větší obrázek představuje nádraží v Olomouci. Na velikost monitoru při rozlišení 1440x900pix připadá 2-3 sekce.

Samotné průsvitky mají kromě svého indexu i souřadnice x,y což mi umožnuje používat jen jeden algoritmus na hledání jízdní cesty a libovolně velikou stanici.

Akorát nemužu přijít na to jak se sem vkládá obrázek. Mám je u sebe na disku, ale webové prostory kam bych směřoval odkaz, to nepoužívám.

A nejde mi ani načíst video.

Takže na ukázku jak to funguje hledejte na youtube:Relay interlocking at Dubina Junction in Czech Republic / Reléové zab. zař. na odbočce Dubina

Ve videu je vidět ruka výpravčího, zmáčkne dvě tlačítka za sebou, tím se určí odkud a kam se pojede, potom se rozsvítí bíle průsvitky, tím výpravčí ví že tam pojede vlak, ke konci videa je pak vidět pohyb vlaku. Červené průsvitky.

Odbočka Dubina je poměrně malá, ale na ukázku stačí. Jednotlivé průsvitky (usečky) jsou ony moje jednotlivé obrázky.

Existují i větší stanice, takže na ně už odkazy vkládám:

Česká Třebová, na odkaze jen polovina panelu. Jedna sekce má okolo 0.75m.
ct1.jpg

Dnes již neexistující panel v Praze Holešovicích, ukazuje ovládání tratě až do Kralup nad Vltavou. Dává představu o velikosti. Pokud výpravčí zmáčkne tlačítko kontrola polohy výměn, pak se rozsvítí bíle skoro všechny průsvitky.
http://images.slideplayer.cz/8/2285503/slides/slid e_4.jpg

Odkaz na video mi funguje, jen se nenačítá, protože mám GPRS (občas i 3G).

Nápad s TShape je jistě dobrý, ale problém spočívá v tom že průsvitky jsou složeny z ruznobarevných pixelů. Šedá průsvitka tak ve skutečnosti není šedá, ale složena z množiny šedých pixelů. A to samé platí i o bílé a červené.

Už jsem si udělal registraci takže sem mužu dát konkrétní obrázky.

První obrázek (Liběchov2-j.jpg)tedy ukazuje stav kdy dochází ke kontrole polohy výhybek a bílé(odstín žluté) větve průsvitek tak ukazují do kterého směru vedou průsvitky. Toto je ovšem malá stanice, kde původně použitý algoritmus stačí. Ale protože mám zdrojový kod stejný a měním jen datové soubory k němu, není problém vykreslit jakékoliv nádraží, jak ukazuje příprava na další simulátor Olomouckého nádraží a tam už je opravdu veliké množství průsvitek. To je vidět na složeném obrázku OLM1.jpg .

Lze pomoci v optimalizaci kodu tak aby se vykreslily jen ty co jsou vidět, ale i tak při velikosti alespon 2 sekce (kvuli komfortu obsluhy, tedy přehlednosti) je zvoleno číslo 2059 průsvitek najednou.

Při hrubém výpočtu 18 průsvitek na jeden řádek (kolej) a kolejí muže být i 40, se dojde k číslu (18*40)*2 (18 průsvitek * 40 kolejí a celek násoben 2 sekcemi) což je 1440 průsvitek, které bych si přál rozsvítit najednou.

[]
[]

Zpět do poradny Odpovědět na původní otázku Nahoru