Autor Téma: Nacitani bitmap  (Přečteno 1912 krát)

_abc

  • Host
Nacitani bitmap
« kdy: 26-08-2012, 10:33:19 »
Ahoj, potrebuji ve sve aplikaci nacist nekolik stovek bitmap do pole. Nacteni provadim v cyklu priblizne takto:
Kód: Delphi [Vybrat]
  1. for i:=0 to pocet-1 do
  2. begin
  3.       pole[i] := TBitmap.Create();
  4.       pole[i].LoadFromFile(vratNazev(i));
  5. end;
  6.  

Vse funguje spravne, ale problemem je, ze pri nacteni velkeho mnozstvi je cyklus dosti pomaly, jak bych mohl tuto cinnost zoptimalizovat?

Dekuji za rady.

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 922
  • Karma: 26
    • Verze Delphi: XE8, Seattle
Re:Nacitani bitmap
« Odpověď #1 kdy: 26-08-2012, 10:50:05 »
Pokud jsou bitmapy stejné velikosti, tak by bylo možné je spojit do jedné velké a načíst do imagelistu (nebo TPicClip z RxLibrary) a přes index přistupovat ke každé buňce zvlášť.
Není-li nezbytné je načítat ze souboru, tak je lze staticky uložit do imagelistu (nebo TPicClip z RxLibrary)...

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2475
  • Karma: 131
    • Verze Delphi: D2007, XE3, DX10
Re:Nacitani bitmap
« Odpověď #2 kdy: 26-08-2012, 11:14:51 »
Kód: Delphi [Vybrat]
  1. for i:=0 to pocet-1 do
  2. begin
  3.       pole[i] := TBitmap.Create();
  4.       pole[i].LoadFromFile(vratNazev(i));
  5. end;
  6.  
Pokud potrebujes mit k dispozici naraz dostupne vsechny instance TBitmap a pokud v nemas v realu na ty bitmapy napojeny nejaky mechanismus, ktery by vlastni nacitavani dale zpomaloval (napr. visualizace nejakym controlem, OnChange event aj.), tak se s tim AFAIK nic udelat neda.

  • Pokud to zpomaluje nejaky navazujici mechanismus, tak ho pripojit az po nacteni vsech bitmap
  • Pokud nemusis mit k dispozici naraz vsechny instance, tak udelat lazy loading tj. zapamatovat si jen jmena souboru a cist je az v pripade potreby tj. rozlozis tu operaci v case
  • Jeste by se asi dal udelat nejaky hybrid, ktery by nevytvarel instance bitmap, ale pres API by se to nacetlo jen do OS a on demand by se HBITMAP zapouzdrovalo instanci TBitmap. Ale mam dojem, ze Win API nema primo funkci pro cteni bitmapy ze souboru, tak bys musel naprgat nejak zjednodusene a optimalizovane to, co mas hotove u TBitmap a dosahnout takovych casu, ze i dodacne obalovani Delphi objektem bude kratsi, nez stavajici stav. Kdyz se divam napr. na http://support.microsoft.com/kb/158898, tak bych si od toho moc nesliboval.

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 922
  • Karma: 26
    • Verze Delphi: XE8, Seattle
Re:Nacitani bitmap
« Odpověď #3 kdy: 26-08-2012, 12:07:10 »
Pokud jsou obrázky různě velké, pak lze také vytvořit jeden velký obrázek a la textura, kde se nepřekrývajíce umístí jednotlivé bitmapy na své souřadnice a jejich pozice a velikosti budou uloženy v map souboru.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1401
  • Karma: 34
    • Pepak.net
Re:Nacitani bitmap
« Odpověď #4 kdy: 26-08-2012, 12:13:17 »
Každopádně bych se zamyslel nad tím, jestli skutečně potřebuji mít několik stovek bitmap načtených do pole. Protože "potrebuji ve sve aplikaci nacist nekolik stovek bitmap do pole" přece není cíl - to je skoro jistě jen prostředek, jak se dostat k nějakému cíli, a je klidně možné, že po lepším zvážení by se našel lepší prostředek. Pokud by například cíl byl "potřebuji rychle vykreslovat několik stovek malých obrázků, které si uživatel může překreslit" (celkem běžný cíl u skinovatelných aplikací), tak dává smysl nemít ty obrázky uložené jako tisíc malých bitmap, ale jako jednu velkou bitmapu, u které mám poznačeno, že "obrázek 167 leží na souřadnicích [580, 48] a má rozměry 32x32". Z toho se taky dá velmi rychle kreslit, ale načítat se to bude pravděpodobně mnohem rychleji...

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 922
  • Karma: 26
    • Verze Delphi: XE8, Seattle
Re:Nacitani bitmap
« Odpověď #5 kdy: 26-08-2012, 12:21:10 »
No hlavně se dají použít různé rastrové vykreslovací operace (to neplatí jen o texturách, samozřejmě)

_abc

  • Host
Re:Nacitani bitmap
« Odpověď #6 kdy: 26-08-2012, 14:49:29 »
Načítám všechny bitmapy do pole z důvodu, že je "přehrávám" a uživatel je tak vidí jako videosekvenci. Navíc přehrávání není sekvenční, ale na základě určitých podmětů se v sekveci skáče. Pokud jsem načítal bitmapu až při potřebě samotného vykreslení bylo to velice pomalé a výsledná sekvence tak běžela velice pomalu. Z toho důvodu jsem se rozhodl hned na začátku načíst všechny obrázky do pole. Problémem tedy teď je, že toto načtení je pomalé a také nároky na operační paměť jsou dosti vysoké.
Zkoušel jsem tedy nepracovat přímo s bpm obrázkami, ale převést je do pole JPEGů. Problémem je ale zase samotné vykreslení, kdy stejně musím jpeg převést na bitmapu.

Offline Jan Fiala

  • Příspěvků: 49
  • Karma: 0
    • PSPad editor
Re:Nacitani bitmap
« Odpověď #7 kdy: 26-08-2012, 15:22:53 »
Budeš muset zavést nějaké inteligentní načítání - načíst to, co potřebuješ (ne ty, které se přeskakují), zbytek "donačítat" na pozadí v průběhu přehrávání.