Optimoi WebGL-suorituskykyä ymmärtämällä ja parantamalla GPU:n muistikaistaa. Opi tekniikoita parempiin siirtonopeuksiin ja sulavampaan renderöintiin eri laitteilla maailmanlaajuisesti.
WebGL GPU:n muistikaistan optimointi: Siirtonopeuden parantaminen
Verkkokehityksen nopeasti kehittyvässä maailmassa WebGL:stä on tullut kulmakivi visuaalisesti rikkaiden ja interaktiivisten kokemusten luomiseen suoraan selaimessa. Sen kyky hyödyntää grafiikkaprosessorin (GPU) tehoa antaa kehittäjille mahdollisuuden rakentaa sovelluksia monimutkaisista 3D-peleistä datan visualisointityökaluihin. Näiden sovellusten suorituskyky riippuu kuitenkin useista tekijöistä, joista GPU:n muistikaista on yksi kriittisimmistä. Tämä blogikirjoitus syventyy WebGL GPU:n muistikaistan optimoinnin yksityiskohtiin, keskittyen tekniikoihin, joilla parannetaan siirtonopeuksia ja lopulta tarjotaan sulavampi ja reagoivampi käyttäjäkokemus monenlaisilla laitteilla maailmanlaajuisesti.
GPU:n muistikaistan ja sen merkityksen ymmärtäminen
Ennen optimointistrategioihin syventymistä on tärkeää ymmärtää peruskäsitteet. GPU:n muistikaista tarkoittaa nopeutta, jolla dataa voidaan siirtää GPU:n ja järjestelmän muiden osien, kuten suorittimen (CPU) tai GPU:n oman sisäisen muistin, välillä. Tämä siirtonopeus mitataan gigatavuina sekunnissa (GB/s), ja se on rajoittava tekijä monissa WebGL-sovelluksissa. Kun kaistanleveys on riittämätön, se voi johtaa pullonkauloihin, jotka aiheuttavat suorituskykyongelmia, kuten hidasta renderöintiä, pudotettuja ruutuja ja yleistä hitautta.
Harkitse globaalia skenaariota: Tokiossa oleva käyttäjä käyttää WebGL-pohjaista arkkitehtonista visualisointityökalua, joka on rakennettu esittelemään kiinteistöjä Dubaissa. Nopeus, jolla tekstuurit, mallit ja muu data ladataan ja renderöidään, vaikuttaa suoraan käyttäjän kokemukseen. Jos muistikaista on rajoitettu, käyttäjä saattaa kokea viiveitä ja turhauttavaa vuorovaikutusta sisällön laadusta riippumatta.
Miksi muistikaistalla on väliä
- Datan siirron pullonkaulat: Suurten datamäärien (tekstuurit, verteksidata jne.) siirtäminen GPU:lle kuluttaa nopeasti kaistanleveyttä. Riittämätön kaistanleveys luo pullonkaulan, joka hidastaa renderöintiä.
- Tekstuurien lataaminen: Korkearesoluutioiset tekstuurit ovat muisti-intensiivisiä. Tehokas tekstuurien lataaminen ja hallinta on ratkaisevaa suorituskyvyn kannalta.
- Verteksidata: Monimutkaiset 3D-mallit vaativat huomattavan määrän verteksidataa, mikä edellyttää tehokasta siirtoa GPU:lle.
- Ruudunpäivitysnopeus: Kaistanleveyden rajoitukset vaikuttavat suoraan ruudunpäivitysnopeuteen. Matalampi kaistanleveys johtaa matalampaan ruudunpäivitysnopeuteen, mikä saa sovelluksen tuntumaan vähemmän reagoivalta.
- Virrankulutus: Muistikaistan optimointi voi myös epäsuorasti vähentää virrankulutusta, mikä on erityisen tärkeää mobiililaitteille.
Yleiset WebGL:n muistikaistan pullonkaulat
Useat osa-alueet voivat aiheuttaa GPU:n muistikaistan pullonkauloja WebGL-sovelluksissa. Näiden pullonkaulojen tunnistaminen on ensimmäinen askel kohti tehokasta optimointia.
1. Tekstuurien hallinta
Tekstuurit muodostavat usein suurimman osan GPU:lle siirrettävästä datasta. Huonosti hallitut tekstuurit ovat yleinen syy kaistanleveysongelmiin.
- Korkearesoluutioiset tekstuurit: Liian suurten tekstuuriresoluutioiden käyttäminen näyttökoon huomioimatta on merkittävä kaistanleveyden kuluttaja.
- Pakkaamattomat tekstuurit: Pakkaamattomat tekstuuri-formaatit kuluttavat enemmän muistia kuin pakatut, mikä johtaa suurempiin kaistanleveysvaatimuksiin.
- Toistuvat tekstuurien lataukset: Samojen tekstuurien toistuva lataaminen GPU:lle tuhlaa kaistanleveyttä.
Esimerkki: Kuvitellaan globaali verkkokauppa-alusta, joka näyttää tuotekuvia. Jos jokainen tuotekuva käyttää korkearesoluutioista pakkaamatonta tekstuuria, sivun latausaika pitenee merkittävästi, erityisesti käyttäjillä alueilla, joilla on hitaammat internetyhteydet.
2. Verteksidatan hallinta
Myös verteksidata, joka edustaa 3D-mallien geometrista informaatiota, vaikuttaa kaistanleveyden käyttöön.
- Liiallinen verteksidata: Mallit, joissa on suuri määrä verteksejä, vaikka ne olisivat visuaalisesti yksinkertaisia, vaativat enemmän datansiirtoa.
- Optimoimattomat verteksiformaatit: Tarpeettoman suurta tarkkuutta käyttävät verteksiformaatit voivat lisätä siirrettävän datan määrää.
- Toistuvat verteksidatan päivitykset: Jatkuva verteksidatan päivittäminen, kuten animoiduissa malleissa, vaatii merkittävästi kaistanleveyttä.
Esimerkki: Globaali 3D-peli, joka käyttää malleja, joissa on suuri polygonimäärä, kokee suorituskyvyn heikkenemistä laitteilla, joilla on rajoitettu GPU:n muistikaista. Tämä vaikuttaa pelikokemukseen pelaajilla esimerkiksi Intiassa, jossa mobiilipelaaminen on yleistä.
3. Puskurien hallinta
WebGL käyttää puskureita (verteksipuskurit, indeksipuskurit) datan tallentamiseen GPU:lle. Tehoton puskurien hallinta voi johtaa kaistanleveyden tuhlaamiseen.
- Tarpeettomat puskuripäivitykset: Puskurien toistuva päivittäminen, kun se ei ole tarpeen, on resurssien tuhlausta.
- Tehoton puskurien allokointi: Puskurien toistuva allokointi ja vapauttaminen voi lisätä yleiskustannuksia.
- Väärät puskurien käyttöön liittyvät liput: Vääränlaisten puskurien käyttötapalippujen (esim. `gl.STATIC_DRAW`, `gl.DYNAMIC_DRAW`) käyttö voi haitata suorituskykyä.
Esimerkki: Datan visualisointisovellus, joka esittää reaaliaikaista pörssidataa, joutuu päivittämään puskureitaan usein. Väärä puskurien käyttö voi merkittävästi vaikuttaa ruudunpäivitysnopeuteen ja reagoivuuteen, mikä vaikuttaa käyttäjiin talouskeskuksissa, kuten Lontoossa tai New Yorkissa.
4. Shader-kääntäminen ja uniform-päivitykset
Vaikka ne eivät suoraan liity muistikaistaan, shader-kääntäminen ja toistuvat uniform-päivitykset voivat epäsuorasti vaikuttaa suorituskykyyn viivästyttämällä renderöintiä ja kuluttamalla suorittimen resursseja, jotka muuten voitaisiin omistaa muistinsiirron hallintaan.
- Monimutkaiset shaderit: Monimutkaisempien shaderien kääntäminen vaatii enemmän aikaa.
- Toistuvat uniform-päivitykset: Uniformien (shadereille välitettävien arvojen) päivittämisestä liian usein voi tulla pullonkaula, erityisesti jos päivitykset sisältävät merkittävää datansiirtoa.
Esimerkki: WebGL-pohjainen sääsimulaatio, joka näyttää erilaisia sääilmiöitä maailmanlaajuisesti ja käyttää monimutkaisia shadereita visuaalisiin tehosteisiin, hyötyisi suuresti shader-kääntämisen ja uniform-päivitysten optimoinnista.
Optimointitekniikat: Siirtonopeuksien parantaminen
Seuraavaksi tarkastelemme käytännön tekniikoita WebGL-suorituskyvyn optimoimiseksi käsittelemällä edellä mainittuja pullonkauloja. Nämä tekniikat pyrkivät parantamaan GPU:n muistikaistan hyödyntämistä ja tehostamaan siirtonopeuksia.
1. Tekstuurien optimointi
Tekstuurien optimointi on ratkaisevan tärkeää datansiirron minimoimiseksi.
- Tekstuurien pakkaus: Käytä tekstuurien pakkausmuotoja, kuten ETC1/2 (mobiililaitteille) tai S3TC/DXT (työpöytäkoneille), vähentääksesi merkittävästi tekstuurien kokoa ja muistikaistan käyttöä. WebGL 2.0 tukee useita pakkausmuotoja, ja selaintuki vaihtelee laitteittain. Harkitse vararatkaisujen käyttöä laitteille, jotka eivät tue tiettyjä formaatteja.
- Mipmapping: Luo mipmap-karttoja tekstuureille. Mipmapit ovat ennalta laskettuja, matalamman resoluution versioita tekstuurista. GPU voi valita sopivan mipmap-tason objektin etäisyyden perusteella kamerasta, mikä säästää kaistanleveyttä käyttämällä pienempiä tekstuureita, kun se on mahdollista.
- Tekstuurin koko ja resoluutio: Muuta tekstuurien kokoa vastaamaan visuaalisia vaatimuksia. Älä käytä 4K-tekstuuria pienelle käyttöliittymäelementille, joka näytetään vain matalammalla resoluutiolla. Ota huomioon laitteen näytön resoluutio.
- Tekstuurikartastot (Texture Atlases): Yhdistä useita pieniä tekstuureita yhdeksi suuremmaksi tekstuurikartastoksi. Tämä vähentää tekstuurien sidontakertojen määrää ja voi parantaa suorituskykyä. Se on erityisen hyödyllinen käyttöliittymäelementeille tai pienille toistuville tekstuureille.
- Laiska lataus ja tekstuurien suoratoisto: Lataa tekstuurit tarpeen mukaan sen sijaan, että lataisit kaiken kerralla. Tekstuurien suoratoisto antaa GPU:lle mahdollisuuden renderöidä tekstuurin matalaresoluutioinen versio samalla, kun täysresoluutioinen versio ladataan taustalla. Tämä antaa sulavamman alkulatauskokemuksen, erityisesti suurille tekstuureille.
Esimerkki: Globaali matkailusivusto, joka esittelee kohteita maailmanlaajuisesti, tulisi priorisoida optimoituja tekstuureita. Käytä pakattuja tekstuureita turistikohteiden kuville (esim. Eiffel-torni Pariisissa, Kiinan muuri) ja luo mipmap-kartat jokaiselle tekstuurille. Tämä takaa nopean latauskokemuksen käyttäjille kaikilla laitteilla.
2. Verteksidatan optimointi
Tehokas verteksidatan hallinta on olennaista optimaalisen suorituskyvyn kannalta.
- Mallien yksinkertaistaminen: Yksinkertaista malleja vähentämällä verteksien määrää. Tämä voidaan tehdä manuaalisesti 3D-mallinnusohjelmassa tai automaattisesti käyttämällä tekniikoita, kuten mesh-desimaatiota.
- Verteksiatribuutit: Valitse verteksiatribuutit huolellisesti. Sisällytä vain tarvittavat attribuutit (sijainti, normaalit, tekstuurikoordinaatit jne.).
- Verteksiformaatti: Käytä pienimpiä mahdollisia datatyyppejä verteksiatribuuteille. Käytä esimerkiksi `gl.FLOAT`-tyyppiä, kun `gl.HALF_FLOAT` (jos tuettu) saattaisi riittää.
- Verteksipuskuriobjektit (VBOs) ja Elementtipuskuriobjektit (EBOs): Käytä VBO:ita ja EBO:ita tallentaaksesi verteksi- ja indeksidataa GPU:n muistiin. Tämä välttää tarpeen siirtää dataa joka ruudulla.
- Instanssirenderöinti (Instancing): Käytä instanssirenderöintiä piirtääksesi tehokkaasti useita saman mallin instansseja. Tämä vaatii verteksidatan siirtämisen vain kerran.
- Verteksien välimuistitus: Tallenna välimuistiin verteksidata, joka ei muutu usein. Vältä saman datan uudelleenlataamista GPU:lle joka ruudulla.
Esimerkki: WebGL-pohjainen peli, jossa on laaja avoin maailma. Verteksidatan optimointi on kriittistä. Hyödynnä instanssirenderöintiä puiden, kivien ja muiden toistuvien objektien piirtämiseen. Käytä mallien yksinkertaistamistekniikoita kaukaisille objekteille vähentääksesi renderöitävien verteksien määrää.
3. Puskurien hallinnan optimointi
Oikeaoppinen puskurien hallinta on elintärkeää kaistanleveyden käytön minimoimiseksi.
- Puskurien käyttötapalippu: Käytä oikeita puskurien käyttötapalippuja luodessasi puskureita. `gl.STATIC_DRAW` harvoin muuttuvalle datalle, `gl.DYNAMIC_DRAW` usein päivitettävälle datalle ja `gl.STREAM_DRAW` datalle, joka muuttuu joka ruudulla.
- Puskuripäivitykset: Minimoi puskuripäivitykset. Vältä puskurien turhaa päivittämistä. Päivitä vain se osa puskurista, joka on muuttunut.
- Puskurin mapitus: Harkitse `gl.mapBufferRange()`-funktion käyttöä (jos tuettu) päästäksesi suoraan käsiksi puskurin muistiin. Tämä voi olla nopeampaa kuin `gl.bufferSubData()` joissakin tapauksissa, erityisesti toistuvissa mutta pienissä päivityksissä.
- Puskuripooli: Dynaamisille puskureille, toteuta puskuripooli. Uudelleenkäytä olemassa olevia puskureita sen sijaan, että loisit ja tuhoaisit niitä jatkuvasti.
- Vältä toistuvaa puskurien sidontaa: Minimoi puskurien sidonta- ja irrotuskertojen määrä. Niputa piirtokutsut vähentääksesi yleiskustannuksia.
Esimerkki: Reaaliaikainen kaavion visualisointityökalu, joka näyttää dynaamista dataa. Käytä `gl.DYNAMIC_DRAW`-lippua datapisteitä sisältävälle verteksipuskurille. Päivitä vain ne osat puskurista, jotka ovat muuttuneet, sen sijaan että lataisit koko puskurin uudelleen joka ruudulla. Toteuta puskuripooli hallitaksesi puskuriresursseja tehokkaasti.
4. Shader- ja uniform-optimointi
Shaderien käytön ja uniform-päivitysten optimointi parantaa yleistä suorituskykyä.
- Shader-kääntäminen: Käännä shaderit ennalta, jos mahdollista, välttääksesi kääntämisen ajon aikana. Hyödynnä shaderien välimuistimekanismeja.
- Shaderin monimutkaisuus: Optimoi shader-koodi tehokkuuden saavuttamiseksi. Yksinkertaista shader-logiikkaa, vähennä laskutoimitusten määrää ja vältä tarpeetonta haarautumista.
- Uniform-päivitykset: Minimoi uniform-päivitysten tiheys. Jos mahdollista, ryhmittele uniform-päivitykset. Harkitse uniform-puskurien (UBOs) käyttöä WebGL 2.0:ssa päivittääksesi tehokkaasti suuria uniform-joukkoja.
- Uniform-datatyypit: Käytä tehokkaimpia datatyyppejä uniformeille. Valitse yhden tarkkuuden liukuluvut kaksoistarkkuuden sijaan, jos mahdollista.
- Uniform Block Objects (UBOs): Toistuvia uniform-päivityksiä varten käytä Uniform Block Objects (UBO) -objekteja. UBO:t mahdollistavat useiden uniform-muuttujien ryhmittelyn, niiden lataamisen GPU:lle yhdellä kertaa ja niiden tehokkaamman päivittämisen. Huom: WebGL 1.0 ei tue UBO:ita, mutta WebGL 2.0 tukee.
Esimerkki: WebGL-pohjainen monimutkaisen fyysisen järjestelmän simulaatio. Optimoi shaderit vähentääksesi laskennallista kuormaa. Minimoi uniform-päivitysten määrä parametreille, kuten painovoima ja tuulen suunta. Harkitse uniform-puskurien käyttöä, jos sinulla on monia päivitettäviä parametreja.
5. Kooditason optimointi
Taustalla olevan JavaScript-koodin optimointi voi edelleen parantaa WebGL-suorituskykyä.
- JavaScript-profilointi: Käytä selaimen kehittäjätyökaluja (Chrome DevTools, Firefox Developer Tools jne.) profiloidaksesi JavaScript-koodisi ja tunnistaaksesi suorituskyvyn pullonkaulat.
- Vältä tarpeettomia operaatioita: Poista kaikki tarpeettomat laskutoimitukset, silmukat ja funktiokutsut.
- Välimuistitus: Tallenna välimuistiin usein käytettyä dataa, kuten tekstuurien kahvoja, puskuriobjekteja ja uniformien sijainteja.
- Optimoi roskienkeruuta varten: Minimoi muistin varaaminen ja vapauttaminen vähentääksesi roskienkeruun vaikutusta suorituskykyyn.
- Käytä Web Workereita: Siirrä laskennallisesti raskaat tehtävät Web Workereille estääksesi pääsäikeen tukkeutumisen. Tämä on erityisen hyödyllistä tehtävissä, kuten mallien lataamisessa tai datan käsittelyssä.
Esimerkki: Datan visualisoinnin hallintapaneeli, jossa datankäsittely suoritetaan suurella datajoukolla. Datan käsittelyn ja mahdollisesti puskuridatan valmistelun siirtäminen Web Workerille pitäisi pääsäikeen vapaana WebGL-renderöintiä varten, mikä parantaa käyttöliittymän reagoivuutta erityisesti käyttäjillä, joilla on hitaampia laitteita tai internetyhteyksiä.
Työkalut ja tekniikat suorituskyvyn mittaamiseen ja seurantaan
Optimointi on iteratiivinen prosessi. Suorituskyvyn mittaaminen ja seuranta on ratkaisevan tärkeää pullonkaulojen tunnistamiseksi ja optimointitoimien validoimiseksi. Useat työkalut ja tekniikat voivat auttaa:
- Selaimen kehittäjätyökalut: Hyödynnä sisäänrakennettuja kehittäjätyökaluja selaimissa, kuten Chrome, Firefox, Safari ja Edge. Nämä työkalut tarjoavat profilointiominaisuuksia JavaScriptille ja WebGL:lle, joiden avulla voit tunnistaa suorituskyvyn pullonkaulat koodissasi ja mitata ruudunpäivitysnopeuksia (FPS), piirtokutsuja ja muita mittareita.
- WebGL-debuggauslaajennukset: Asenna selaimeesi WebGL-debuggauslaajennuksia (esim. WebGL Inspector Chromelle ja Firefoxille). Nämä laajennukset tarjoavat edistyneitä debuggausominaisuuksia, mukaan lukien mahdollisuuden tarkastella shader-koodia, nähdä tekstuuridataa ja analysoida piirtokutsuja yksityiskohtaisesti.
- Suorituskyvyn mittausrajapinnat (APIs): Käytä `performance.now()`-rajapintaa JavaScriptissä mitataksesi tiettyjen koodiosioiden suoritusaikaa. Tämän avulla voit paikantaa tiettyjen operaatioiden suorituskykyvaikutuksen.
- Ruudunpäivitysnopeuden laskurit: Toteuta yksinkertainen ruudunpäivitysnopeuden laskuri seurataksesi sovelluksen suorituskykyä. Seuraa renderöityjen ruutujen määrää sekunnissa (FPS) arvioidaksesi optimointitoimien tehokkuutta.
- GPU-profilointityökalut: Käytä omistettuja GPU-profilointityökaluja, jos ne ovat saatavilla laitteellasi. Nämä työkalut tarjoavat yksityiskohtaisempaa tietoa GPU:n suorituskyvystä, mukaan lukien muistikaistan käytöstä, shaderien suorituskyvystä ja muusta.
- Vertailutestaus (Benchmarking): Luo vertailutestejä arvioidaksesi sovelluksesi suorituskykyä erilaisissa olosuhteissa. Suorita nämä testit eri laitteilla ja selaimilla varmistaaksesi johdonmukaisen suorituskyvyn eri alustoilla.
Esimerkki: Ennen globaalin tuotekonfiguraattorin julkaisua, profiloi sovellus perusteellisesti käyttämällä Chrome DevTools -työkalujen suorituskyky-välilehteä. Analysoi WebGL-renderöintiajat, tunnista pitkäkestoiset operaatiot ja optimoi ne. Käytä FPS-laskureita testauksen aikana markkinoilla, kuten Euroopassa ja Amerikoissa, varmistaaksesi tasaisen suorituskyvyn eri laitekokoonpanoissa.
Monialustaiset näkökohdat ja globaali vaikutus
Kun optimoidaan WebGL-sovelluksia globaalille yleisölle, on olennaista ottaa huomioon monialustainen yhteensopivuus ja laitteiden moninaiset ominaisuudet maailmanlaajuisesti.
- Laitteiden monimuotoisuus: Käyttäjät käyttävät sovellustasi laajalla laitekirjolla, huippuluokan pelitietokoneista vähätehoisiin älypuhelimiin. Testaa sovellustasi useilla laitteilla, joilla on erilaiset näyttöresoluutiot, GPU-ominaisuudet ja muistirajoitukset.
- Selainyhteensopivuus: Varmista, että WebGL-sovelluksesi on yhteensopiva suosittujen selainten (Chrome, Firefox, Safari, Edge) uusimpien versioiden kanssa eri käyttöjärjestelmissä (Windows, macOS, Android, iOS).
- Mobiilioptimointi: Mobiililaitteilla on usein rajoitettu GPU:n muistikaista ja prosessointiteho. Optimoi sovelluksesi erityisesti mobiililaitteille käyttämällä tekstuurien pakkausta, mallien yksinkertaistamista ja muita mobiilikohtaisia optimointitekniikoita.
- Verkko-olosuhteet: Ota huomioon verkko-olosuhteet eri alueilla. Joillakin alueilla käyttäjillä voi olla hitaammat internetyhteydet. Optimoi sovelluksesi minimoimaan siirrettävän datan määrä ja resurssien lataamiseen kuluva aika.
- Lokalisaatio: Jos sovellustasi käytetään maailmanlaajuisesti, harkitse sisällön ja käyttöliittymän lokalisointia tukemaan eri kieliä ja kulttuureja. Tämä parantaa käyttäjäkokemusta eri maiden käyttäjille.
Esimerkki: WebGL-pohjainen interaktiivinen kartta, joka näyttää reaaliaikaista säätietoa maailmanlaajuisesti. Optimoi sovellus mobiililaitteille käyttämällä pakattuja tekstuureita ja mallien yksinkertaistamista. Tarjoa eri yksityiskohtaisuustasoja laitteen ominaisuuksien ja verkko-olosuhteiden perusteella. Tarjoa käyttöliittymä, joka on lokalisoitu eri kielille ja kulttuurisille mieltymyksille. Testaa suorituskykyä maissa, joissa on erilaiset infrastruktuuriolosuhteet, varmistaaksesi sujuvan kokemuksen maailmanlaajuisesti.
Yhteenveto: Jatkuvaa optimointia WebGL-huippuosaamiseen
GPU:n muistikaistan optimointi on ratkaiseva osa suorituskykyisten WebGL-sovellusten rakentamista. Ymmärtämällä pullonkaulat ja toteuttamalla tässä blogikirjoituksessa kuvatut tekniikat voit merkittävästi parantaa WebGL-sovellustesi suorituskykyä ja tarjota paremman käyttäjäkokemuksen globaalille yleisölle. Muista, että optimointi on jatkuva prosessi. Seuraa jatkuvasti suorituskykyä, kokeile eri tekniikoita ja pysy ajan tasalla uusimmista WebGL-kehityksistä ja parhaista käytännöistä. Kyky toimittaa korkealaatuisia grafiikkakokemuksia monenlaisilla laitteilla ja verkoissa on avain menestykseen nykypäivän verkkoympäristössä. Pyrkimällä jatkuvasti optimointiin voit varmistaa, että WebGL-sovelluksesi ovat sekä visuaalisesti upeita että suorituskykyisiä, palvellen maailmanlaajuista yleisöä ja edistäen positiivista käyttäjäkokemusta kaikissa demografisissa ja globaaleissa alueissa. Optimointimatka hyödyttää kaikkia, Aasian loppukäyttäjistä Pohjois-Amerikan kehittäjiin, tekemällä WebGL:stä saavutettavan ja suorituskykyisen kaikkialla maailmassa.