Jak předejít problémům s vyrovnávací pamětí? - Grafika.cz - vše o počítačové grafice

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Webdesign

Jak předejít problémům s vyrovnávací pamětí?

Macromedia Flash tutorial

21. června 2001, 00.00 | Tímto začínáme miniseriál skriptováni pro středně pokročilé ve Flashi. Přestože jde o obsahově náročnější téma, určitě bude pro mnohé čtenáře zajímavé.

Ti, kdo dali na web svoji stránku, napsanou ve Flashi, byli patrně nejednou nervózní z toho, že na stránce udělají změnu.... a ta změna NENÍ na webu vidět. Proč se tak děje? Jednoduše řečeno: pokud si uživatel jednou načte vaši stránku do browseru, připojené swf soubory, vygenerované flashem, se uloží na uživatelův disk do složky Temporary Internet Files a při dalším otevření browser moudře usoudí, že soubor už nebude stahovat a přečte si jej z uživatelova disku. Smutné a nepraktické, že?

Těmto problémům lze částečně předejít v html kódu pomocí tzv. meta tagů:

<HEAD>
<META HTTP-EQUIV="Expires" CONTENT="Mon, 04 Dec 1999 21:29:02 GMT">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">
<TITLE>MyPage</TITLE>
</HEAD>

Dá se také použít asp nebo cgi skript, případně MM Generator...

Jenomže co s tím, když používáte načítání dalších externích swf souborů? Nebo když váš skript obsahuje načítání proměnných z textových souborů? V té chvíli se zdá, že problém je neřešitelný, pokud nechcete sáhnout k dražšímu nebo pracnějšímu řešení výše uvedeného externího načítání....

Po sérii vlastních pokusů a rad zkušených "flash-guru" jsem vytvořil univerzální a jednoduchou metodu, která umožňuje "dynamické" načítání externích souborů, včetně hlavní stránky. V ukázce jsou použité i další praktické skriptové metody.

Takže postup je následující:

  1. Vytvořte si soubor index.fla. Tento soubor bude zcela prázdný, bude mít pouze tři prázdné framy s Action Scriptem:

    První frame:

    varA = 10000*Math.random()
    nacist = "jmenoSouboru.swf?var=" + varA
    loadMovieNum (nacist, 0)
    _level0._visible = false

    Co se stane na tomto prvním framu? V prvním řádku vygeneruji proměnou varA, která bude mít náhodnou hodnotu 0-10000. Ve druhém řádku vytvořím textovou proměnou, kterou použiji pro načítání externího souboru. Tím, že nebudu načítat soubor "jmenoSouboru.swf", ale "jmenoSouboru?var=nahodneCislo", při každém načítání se browser domnívá, že načítáme nějaký nový soubor (posíláme vlastně proměnou metodou GET).

    Frame můžeme obměnit. Místo náhodného čísla, které zajistí POKAŽDÉ, že se soubor načte znovu, můžeme sem zapsat konstantu. Proč? Občas je vhodné nezatěžovat uživatele neustálým znovunačítáním a nechat ho, ať se soubor stáhne daleko rychleji z jeho pevného disku. Ve chvíli, kdy na stránce uděláte změnu, konstantu prostě ručně změníte a soubor se uživatelům načte znovu.

    Na třetím řádku skriptu dám pokyn, aby se do levelu 0 (základní level, neplést s _root !) začal natahovat externí soubor. Level zle měnit dle potřeby.

    Na čtvrtém řádku udělám _level0 neviditelným. Proč? Aby se externí soubor nezobrazoval po "kouskách", jako to dělá klasické html, ale ve výsledku se zobrazil až úplně celý. Ten, kdo třeba použil maskované objekty, ví, o čem hovořím.

    Druhý frame:

    natahnout = _level0.getBytesTotal()
    natazeno = _level0.getBytesLoaded()
    _level0._visible = false

    V tomto framu zjišťuji, kolik bytů natahovaného souboru se má celkově stáhnout a kolik je již staženo. Z těchto hodnot pak můžete udělat například "inteligentní preloader" se zobrazováním procent natažení nebo s ukazatelem rychlosti připojení. Protože se chystám vstoupit do načítací smyčky, budu na tomto framu neustále říkat, ať je _level0 stále ještě neviditelný.

    Třetí frame:

    if ((!(natazeno == null || natahnout == null)) && natazeno >= natahnout) {
    _root._visible = true
    stop()
       } else {
    gotoAndPlay(2)
    }

    Třetí frame je smyčka s logickou podmínkou. Na první pohled vypadá možná složitě, ale nebojte se, skutečnost je prostá.

    (!(natazeno == null || natahnout == null) je ošetření jedné nedokonalosti flashe: při prvním pokusu načíst hodnoty getBytesLoaded a getBytesTotal flash tvrdí, že tyto hodnoty neexistují. A tím by celou načítací smyčku předčasně ukončil. Výše uvedený výraz tedy říká: "pokud jsou hodnoty proměnných nedefinované, pokračuj ve smyčce". Neošetření tohoto problému je častá chyba, která dělá např. některé preloadery nefunkční. Pro doplnění: použitý výraz null je klíčové slovo, kterým se lze dotazovat na proměnné, jejichž hodnoty neexistují nebo nemají definovaný typ.

    Druhá část porovnává hodnoty proměnných a říká "pokud je množství již načtených bytů větší nebo rovno množství bytů, které se celkem mají natáhnout, ukonči smyčku". Možná se pozastavíte nad tím, proč tam není jen rovnítko, když množství načtených bytů NIKDY nemůže být větší než množství, které je celkově třeba načíst. Hm, to je jedna z dalších mušek flashe: když tam dáte JEN rovnítko, on se prostě občas nestrefí (experimentálně potvrzeno).... bůhví proč.....

    Druhý řádek zviditelní již celý natažený soubor a následuje stopka, která zastaví načítací sekvenci.

    Pokud nejsou splněny podmínky pro ukončení smyčky, skript se vrací na předchozí frame a znovu tam porovnává hodnoty getBytesLoaded a getBytesTotal tak dlouho, dokud není celý externí soubor natažen.

    Tak, a máme za sebou první krok. Máme soubor index.fla. Když ho otestujeme, zjistíme, že nám flash vyhodí hlášku "nemohu otevřít soubor....". Toho se nelekejte, při testování se nespouští webovské prostředí a opravdu soubor s posíláním parametru nelze načíst. Ve výsledku na internetu to bude fungovat. Pokud si chcete soubor otestovat (například jestli opravdu načítá potřebný externí soubor), jednoduše dočasně upravte první frame takto:

    varA = Math.floor(10000*Math.random())
    nacist = "jmenoSouboru.swf" //?var=" + varA
    loadMovieNum (nacist, 0)
    _level0._visible = false

    Tím si odstraníte volání souboru s proměnou a vše bude ok. Ale při generování webovské verze dejte vše zase zpátky do původního stavu.

    Pokud používáte "dynamické načítání" více swf do jednoho a téhož levelu (klasický příklad: mám vytvořenou homepage, po stisknutí tlačítka v menu načítám jednotlivé položky jako externí .swf), zjistíte další nepříjemnost: flash si pamatuje hodnoty getBytesTotal() a getBytesLoaded() z prvního načítání a načítací smyčka se tudíž okamžitě ukončí. Co s tím? Je třeba vzít třetí frame, o jeden ho posunout dopředu, pak vzít druhý frame a zkopírovat ho do uvolněného třetího (teď bude mít smyčka čtyři framy). Flash sice na druhém framu vyhodí nepravdivou informaci, ale na třetím se "chytí" a obnoví hodnoty proměnných.

  2. Druhý a závěrečný krok: vygenerujte a upravte index.html
  3. To je velice jednoduché. Hotový index.html doporučuji pouze doplnit o jiný head, aby se uživatelovi nevypisovalo na lištu browseru slovo "index", ale vámi zvolený název stránky.

    V případě, že jde o soubor index, natahujete samozřejmě úvodní stránku. Ale touto metodou můžete načítat jakékoliv další swf soubory (pokusím se časem napsat krátký článeček o tom, proč se to dělá, jaká jsou úskalí, jak načítat dynamicky do jednoho levelu další stránky a podobně). A načítat můžete také externí textové soubory s proměnnými (o těch se také pokusím napsat).

Takže v této chvíli máte hotovo a jste bez problémů s cashingem.

Doufám, že vám tento tutorial alespoň trochu pomůže a omlouvám se úplným začátečníkům, kteří možná některé postupy nepochopí. Ale kdybych měl vše popisovat do podrobností, byla by z toho knížka.

Tématické zařazení:

 » Rubriky  » Go verze  

 » Rubriky  » Webdesign  

 

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: