
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.