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.

Odpověď na otázku

1 Zadajte svou přezdívku:
2 Napište svou odpověď:
3 Pokud chcete dostat ban, zadejte libovolný text:

Zpět do poradny