rendrovací endžinTakéBrowser engine, Layout engine, Renderer, Vykreslovací enginePokročilý
Definice
Rendering engine je softwarová komponenta, která převádí strukturovaný popis obsahu nebo scény na obraz zobrazitelný na displeji. Ve webovém prohlížeči zpracovává HTML, CSS a DOM do vrstev pixelů, v grafice a 3D nástrojích počítá z geometrie, materiálů a světel výsledný snímek. Příkladem jsou Blink, WebKit, Gecko nebo Cycles.
Nezaměňujte: Rendering engine znamená v prohlížeči jádro pro vykreslení HTML a CSS (Blink, WebKit, Gecko), zatímco v počítačové grafice systém pro výpočet obrazu z 3D scény (Cycles, EEVEE, Arnold).
Než se na to spolehnete: Wikidata ID Q1435416 pro browser engine jsem neověřoval proti databázi, prosím o kontrolu. Rovněž tvrzení o povinnosti WebKitu na iOS platilo dlouhodobě, ale kvůli DMA v EU se situace mění a formulace v příkladu i FAQ může být časem nepřesná.
Dva světy jednoho názvu
Rendering engine označuje ve dvou různých oborech dvě velmi odlišné věci, které spojuje jediný cíl: vyrobit obraz. Ve webu jde o jádro prohlížeče, které z textového dokumentu vytvoří rozvržení stránky. V počítačové grafice jde o systém, který z 3D scény spočítá barvu každého pixelu. Kontext obvykle rozhodne během první věty, ale při hledání dokumentace se tyhle dva významy pravidelně pletou.
Co dělá jádro prohlížeče
Jádro prohlížeče vezme bajty odpovědi z HTTP, rozparsuje HTML do DOM stromu a CSS do sady pravidel. Následně proběhne výpočet stylů, sestavení render stromu (prvky s display: none se do něj nedostanou), layout neboli přesný výpočet pozic a rozměrů, malování do vrstev a nakonec kompozice vrstev na obrazovku. JavaScript běží v samostatném enginu (V8, SpiderMonkey, JavaScriptCore), ale sdílí s vykreslováním hlavní vlákno, takže dlouhý skript zablokuje i vykreslení.
Dnes se prakticky používají tři rodiny: Blink (Chrome, Edge, Opera), WebKit (Safari a všechny prohlížeče na iOS) a Gecko (Firefox). Kompatibilita mezi nimi je důvod, proč se testuje víc než jen v Chromu.
Proč layout bolí víc než paint
Layout je globální operace: změna šířky jednoho prvku může posunout celý zbytek stránky. Když skript v cyklu zapíše styl a hned si přečte offsetHeight, donutí engine layout přepočítat okamžitě a synchronně. Tomuhle vzoru se říká layout thrashing a je to jedna z nejčastějších příčin trhaného scrollování.
Kde se počítá 3D snímek
V grafickém světě je rendering engine část, která ze scény (geometrie, materiály, kamera, světla) vytvoří rastrový obrázek. Rasterizační enginy v shaderech promítají trojúhelníky do obrazovky a hodí se do reálného času, path tracing sleduje paprsky světla a dává fyzikálně věrný výsledek za cenu minut nebo hodin výpočtu. Blender dodává obojí: EEVEE pro náhled, Cycles pro finální render.
Kde se hranice stírá
Moderní prohlížeč je zároveň grafickou aplikací. Kompozici vrstev předává na GPU, přes WebGL a WebGPU zpřístupňuje grafický hardware přímo stránce a CSS transformace a animace jsou navrženy tak, aby je bylo možné zpracovat mimo hlavní vlákno. Právě proto animace transform a opacity běží plynule, zatímco animace top nebo width vynutí layout v každém snímku.
Co z toho plyne pro praxi
Vývojář rendering engine přímo nepíše, ale jeho chování určuje, jestli bude web plynulý. U webu to znamená držet rozpočet 16 milisekund na snímek, minimalizovat vynucené přepočty a nepodceňovat rozdíly mezi WebKitem a Blinkem. U 3D to znamená vědomě volit mezi rychlostí náhledu a věrností finálního výstupu.
Příklady z praxe
Layout thrashing v seznamu položek
Skript prochází sto prvků, každému nastaví šířku a hned poté si přečte jejich výšku. Každé čtení donutí engine dokončit layout, takže místo jednoho přepočtu jich proběhne sto. Oprava spočívá v rozdělení fáze čtení a zápisu: nejdřív se posbírají všechny hodnoty, pak se teprve zapisuje.
// špatně: čtení a zápis se střídají items.forEach(el => { el.style.width = '200px'; console.log(el.offsetHeight); // vynutí layout }); // lépe: nejdřív číst, pak zapisovat const heights = items.map(el => el.offsetHeight); items.forEach((el, i) => { el.style.width = heights[i] + 'px'; });Rozdílný výsledek ve WebKitu a Blinku
E-shop testovaný jen v Chromu vypadá na iPhonu rozbitě, protože Safari používá WebKit s odlišnou implementací některých CSS vlastností a jiným časováním prohlížečových událostí. Na iOS je WebKit povinný i pro Chrome, takže testování v desktopovém Chromu problém neodhalí. Řešením je test na reálném zařízení nebo v simulátoru Safari.
Časté omyly
- MýtusChrome, Edge a Opera jsou různé prohlížeče, takže je stačí otestovat všechny tři.
- Ve skutečnostiChrome, Edge i Opera stojí na jádru Blink, takže se ve vykreslování chovají prakticky stejně. Skutečně odlišné výsledky přinese až test v Safari (WebKit) a Firefoxu (Gecko).
- MýtusRendering engine a JavaScriptový engine jsou totéž.
- Ve skutečnostiRendering engine řeší parsování HTML, styly, layout a malování, zatímco JavaScriptový engine (V8, SpiderMonkey) vykonává kód. Jsou to oddělené komponenty, ale sdílejí hlavní vlákno, takže se navzájem blokují.
- MýtusPřesun vykreslování na GPU vždycky zrychlí stránku.
- Ve skutečnostiVynucení vlastní kompozitní vrstvy u příliš mnoha prvků zvýší spotřebu paměti GPU a přenosy mezi CPU a GPU, což může výsledek naopak zhoršit. Zrychlení dává smysl u prvků, které se skutečně často animují.
Časté dotazy
- Jak zjistím, který rendering engine používá můj prohlížeč?
- Rendering engine prohlížeče se dá zjistit z about stránky prohlížeče nebo z user agent řetězce v konzoli. Chrome, Edge, Opera, Brave a Vivaldi používají Blink, Safari na macOS i všechny prohlížeče na iOS používají WebKit, Firefox používá Gecko. Na iOS je situace zvláštní: i Chrome tam vykresluje přes systémový WebKit, protože Apple dlouho nepovoloval jiná jádra. Pro testování to znamená, že desktopový Chrome neřekne nic o tom, jak se stránka zobrazí na iPhonu.
- Proč se stránka při scrollování trhá, i když má málo obsahu?
- Trhané scrollování obvykle nezpůsobí množství obsahu, ale práce, kterou musí rendering engine udělat mezi snímky. Nejčastější příčiny jsou dlouhé JavaScriptové úlohy blokující hlavní vlákno, animace vlastností vyžadujících layout (width, top, margin), příliš složité CSS selektory nebo velké stínové a filtrové efekty přes rozsáhlé plochy. Panel Performance ve vývojářských nástrojích ukáže, kolik času padne na scripting, layout a paint. Cílem je vejít se do zhruba 16 milisekund na snímek při 60 snímcích za sekundu.
- Jaký je rozdíl mezi rasterizací a path tracingem u 3D rendering enginů?
- Rasterizace promítá trojúhelníky přímo do obrazovky a osvětlení aproximuje pomocí shaderů a předpočítaných map, takže zvládne desítky snímků za sekundu a používá se ve hrách a náhledech. Path tracing naopak simuluje dráhy světelných paprsků scénou a vzorkuje je, čímž získá fyzikálně věrné odrazy, měkké stíny i globální osvětlení, ale jeden snímek trvá minuty až hodiny. Blender nabízí obojí: EEVEE rasterizuje, Cycles trasuje paprsky. Volba závisí na tom, zda potřebujete rychlost, nebo věrnost.
- Ovlivňuje rendering engine SEO a hodnocení stránky?
- Rendering engine ovlivňuje SEO nepřímo přes rychlost vykreslení. Googlebot pro indexaci používá jádro založené na Chromiu, tedy Blink, takže vidí stránku podobně jako Chrome včetně obsahu vytvořeného JavaScriptem. Metriky Core Web Vitals, konkrétně Largest Contentful Paint, Cumulative Layout Shift a Interaction to Next Paint, měří přímo výsledky práce vykreslovacího jádra a vstupují do hodnocení. Pomalý layout, skákající obsah nebo blokovaný hlavní vlákno tedy poškodí jak uživatelský dojem, tak pozici ve výsledcích.
Zdroje
- HTML Standard(otevře se v novém okně)
- CSS Snapshot(otevře se v novém okně)
- Populating the page: how browsers work(otevře se v novém okně)
- Blender Manual: Rendering(otevře se v novém okně)
- Browser engine(otevře se v novém okně)