Mám ve Windows Forms webový applet, kterému schovávám načítání za načítací obrázek. Mordoval jsem se s tím 3 dny, nemohl jsem donutit ten applet, aby mi mezi stránkami kompletně nemazal buffer, což způsobovalo probliknutí. Nicméně vyhrál jsem, než vlezu na další stránku, schovám pěkně applet za obrázek a ono se to tam načte pod pokličkou. Nastal ovšem druhý boj. Prohlížeče dnes jsou až moc aktivní a vlastně nedokáži určit, kdy už mohu nechat zobrazit stránku. Zatím jediné řešení je timer napevno, což samozřejmě nemusí sedět na dalších PC atp. Problém je, že ani třeba obrázek na konci stránky není směrodatný, protože on si jej stejně natáhne dříve, než jej skutečně zobrazí. Tedy umím číst requesty, vím, co se děje uvnitř appletu, ale nevím, jak poznat, kdy už mi to neblikne. Jakékoli zdroje si tahá před dorenderováním stránky, takže ani zvukový soubor na konci stránky mi nepomohl. Hloupě mne napadlo pustit tedy timer v JS a počkat na něj, ale i ten si prohlížeč přednačítá. Jinak tedy používám CefSharp. Nicméně potřebuji jen třeba JS, co se pustí až po kompletním načtení stránky - tak, aby mi jej prohlížeč nepřednačítal. Cokoli jsem zkoušel nebylo měřítkem, že už je stránka kompletně načtená. Zatím mi vyšel spolehlivý timer 500 ms, ale to bych pro jistotu musel dát 1 sekundu a modlil bych se, že to bude stačit všem/většině PC... Můžu také pustit nějaký JS, který by schoval celou stránku pod další schovávací obrázek a pak bych odkryl ten C# obrázek. Pak už bych to ovládal v JS. Tak se zde ptám, jaké posloupnosti by se dalo nejvíce věřit. Zatím schovávám celý Form dalším Formem a oba s DoubleBuffer, takže to hezky funguje a plynule mění obraz. Žádné bliknutí. Ale nemám žádný event RenderDone...
Fórum › .NET
Kdy uvěřit webové stránce?
#2 gna
Tak já používám jQuery a dal jsem si tam do něj načtení neexistujícího wav. Mám ověřeno, že i tak si browser dříve natáhne JavaScript, než je skutečně dorenderováno. Je pravda, že nativní onload by v tomto případě mohl dopadnout lépe. On už bohužel prohlížeč neříká, v jakém stavu opravdu stránka je. On ti řekne, že prvek už je viditelný, ačkoli v době běhu scriptu jej teprve zobrazuje. Celá ta GPU optimalizace právě mlží, co se skutečně renderuje. Přesně to řeším, že scripty, zdroje dokonce i události si browser extrémně optimalizuje. Onload dávno neodpovídá stavu dokončeného renderu - ve skutečnosti to celé podléhá optimalizaci GUI, kdy uvnitř JS skutečně stav načtení odpovídá, ale vykreslovací vlákno třeba provede ještě jedno závěrečné vykreslení. Po jQuery ready se mi provedly ještě dvě vykreslovací iterace... Tak se chystám udělat skrývací obrázek ještě v tom prohlížeči a budu se modlit, aby se obrázek přes celou obrazovku s nejvyšší prioritou atp. vyrenderoval tak, že mi tam už neskočí žádné vyprazdňovací renderování...
#4 Mutagen
To zní moc fajn a nadějně. To mne nenapadlo. Umím číst buffer obrazovky, ale jak porovnávat buffer? Velikost je přeci blbost, velikost je daná velikostí elementu. Musel bych nějak testovat (Pokud vím, zelený pixel je stejně velký, jako modrý.) Určitě bych to musel nějak optimalizovat - číst jen určitý fragment bufferu a asi v něm porovnat všechny pixely, hmm...
#1 Matěj Andrle
nevim jak je to při programování web stránek, ale normálně nepoužívám DoubleBuffering při práci s GDI+ protože se mi to moc nelíbí. Jednoduše si vytvořim bitmapu do paměti (i jako MemoryStream) a zapisuju do ní a pak ji jen přiřadim ke contorlu, kde se má objevit. Nic víc. Když udělám jakýkoliv jiný postup, začne to problikávat.
#6 JerryM
Mně blikalo už jen načítání stránky. To vůbec nesouvisí s renderováním, ale s tím, že se Chromium snaží vykreslovat průběžné načítání stránky, takže před opuštěním současné kompletně vyčistí frame i buffery. To způsobí bliknutí barvy pozadí.
jQuery ready se spouští před načtením dalších závislostí. Já jsem mluvil o JavaScriptovém window.onload, který se spouští až potom. Tam pak spustíš timer a dáš tomu ještě pár milisekund na vykreslení.
Co se týče toho bufferu, tak nic optimalizovat nemusíš, protože to bude blesková záležitost.
document.ready jsi zkoušel? https://www.w3schools.com/jquery/event_ready.asp Ale pozor! Neřeší, co s DOM pak udělá nějaký javascript.
Jinak tak docela nechápu, co chceš udělat.
hu
#9 hlucheucho
Chci udělat to, že chci schovat překrývací obrázek až po plném načtení stránky. Jdu ozkoušet ten window.onload, který jak již jsem psal, uznávám, že může běžet ve vhodnější čas. Poslední možností je porovnávat buffer pixel po pixelu. Je pravda, že porovnávání bufferu bude rychlé, dokud budou rozdíly velké.
#9 hlucheucho
Tak se zdá, že window.onload skutečně už je důvěryhodný. Mám z toho přád vítr a musím říci, že při hrubém několikanásobném načítání to občas blikne, což mé řešení skoro nikdy, ale to už asi nebudu řešit. Dělám to v cyklu se spánkem a limitem, takže to možná ještě občas odnese ten limit, že jej třeba i zvětším... Po onload zavolám stažení neexistující hudby, čímž poznám, že klient je načten - stažení zamítnu a zavolám:
int iterations = 0;
while (!contentLoaded && iterations < 10)
{
Thread.Sleep(50);
iterations++;
}
...
schovejCoverImage(); // ilustrační kód
#12 hlucheucho
Chci Forms CefSharp donutit počkat s renderováním, než si načte stránku. Nenašel jsem po 3 dnech jedinou možnost, jak zdržet renderování. Používá to Nvidia GPU optimalizaci, takže z Forms se dovnitř nedostanu. Když Chromium nepočká s renderem, tak vymaže současný krásný obraz a začne načítat novou stránku. Už jen to, že používám tmavé pozadí hned trefí do oka, jak to blikne... Natož, když se mi renderuje stránka, kde se ještě pozicují prvky atp. - právě z toho pohledu nevidím žádnou snadnou možnost zabránit problikávání obrazu.
Co tak vím, tak u webu se renederování děje na straně serveru. K renderování dojde tedy až si od serveru vyžádám novou stránku a nebo nový obsah např. submit po vyplnění formuláře. Tato změna vede k probliknutí - původní obsah zmizí a chvíli trvá než se objeví nový. Pokud se to má chovat jako desktopová aplikace, obchází se to pomocí javascriptu. Ten umí načíst část nebo celou stránku aniž by se sáhlo do původního zobrazení a pak teprve změnit DOM a tím vložit nový obsah. Jsou na to i hotové knihovny. Mám pocit, že tyhle věci umí "one page application" co je v MS VS jako šablona (nikdy jsem takovou aplikaci nedělal).To je vše, co z webařiny vím a používám. Na překreslení grafu a tabulky mi to stačilo a žádné blikání jsem nezaznamenal.
hu
#1 Matěj Andrle
já myslim, že některý věci ve web grafice nejdou vubec udělat a musí se použít rozhraní WebGL z Khronosu: https://www.khronos.org/…; takhle je dělanej třeba https://www.windy.com/?…
#14 hlucheucho
Nemám server. Strkám mu offline obsah rovnou, nikdo na nic nečeká. Všechny zdroje jsou otevřené streamy rovnou v prohlížeči Problikne to jenom proto, že ten blb vvymaže původní buffer a trvá to chvíli, než vyrenderuje nový obsah. Takže jsem to schoval a je to cajk. Jen řeším, kdy už je hotovo...
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
C# ovladani funkci na webove strance — založil Anon
Cenově dostupné webové stránkyWebnia.cz - tvoříme cenově dostupné we… — založil null_while
Kdy to kenečně bude — založil selkir
Kdy budu připraven na 2D hry — založil Adam
OOP - Kdy použít interface? — založil BigBear
Moderátoři diskuze