Selainliitännäinen Unitylle

Unityn kehitystyökalut ja -moottori ovat nykyään ylivoimaisesti yleisin tapa rakentaa VR- ja AR-sovelluksia. Aiemmin olemme mahdollistaneet verkkopohjaisten kokemusten viennin Unitystä. Tänään olemme innoissamme esittelemässä varhaista työtä, joka käsittelee toista tapaa, jolla Unityn kehittäjät haluavat käyttää verkkoa: komponenttina Unity-pohjaisissa virtuaaliympäristöissään.

Perustaen työhömme, jolla portasimme selainmoottorin monille alustoille ja upotusskenaarioille, mukaan lukien Firefox Reality AR HoloLens 2:lle, olemme rakentaneet uuden Unity-komponentin, jonka perustana on Servo, nykyaikainen web-moottori, joka on kirjoitettu Rust-ohjelmointikielellä.

Unity-moottorilla on erittäin mukautuva monialustainen liitännäisjärjestelmä, jossa on terve ekosysteemi kolmansien osapuolten liitännäisiä, sekä avoimen lähdekoodin että patentoituja. Liitännäisjärjestelmän avulla voimme ajaa OS-natiiveja moduuleja ja liittää ne suoraan Unityn skriptiympäristössä suoritettaviin komponentteihin.

Kokeilujen tavoitteina oli rakentaa Unityn natiivi plugin ja joukko Unityn C#-skriptikomponentteja, joiden avulla kolmannet osapuolet voisivat sisällyttää Servo-selainikkunoita Unityn kohtauksiin, ja valinnaisesti tarjota tukea selainpinnan käyttämiseen Unityllä rakennetuissa VR- ja AR-sovelluksissa.

Tänään julkaisemme täysin toimivan prototyypin Servo-verkkoselaimesta, joka pyörii Unity-pluginin sisällä. Tämä on alkuvaiheen katsaus työhömme, mutta tiedämme, että tämäntyyppinen ratkaisu herättää suurta innostusta, joten toivomme, että kokeilet tätä prototyyppiä, annat palautetta ja tulet mukaan rakentamaan asioita sen avulla. Tänään julkaistu versio kohdistuu macOS-alustaan, mutta tulemme lisäämään joitakin muita Servon tukemia alustoja hyvin pian.

Alkuun pääseminen

Olemme avanneet laajennuksen lähdekoodin osoitteessa https://github.com/MozillaReality/servo-unity. Siirry sinne, klikkaa tähteä ja haarukoi koodi, tarkista se paikalliselle koneellesi ja avaa projekti sitten Unityn sisällä.

Kehittäjäohjeet löytyvät arkiston README-tiedostosta.

Mitä se tekee

Voit työskennellä suoraan selainikkunan ja kontrollien kanssa Unity-editorin sisällä. Ylimmän tason konfiguraatio on ServoUnityController objektissa. Muita tärkeitä objekteja kohtauksessa ovat ServoUnityWindow, ServoUnityNavbarController ja ServoUnityMousePointer.

ServoUnityWindow voidaan sijoittaa mihin tahansa Unityn kohtauksessa. Tässä olemme pudottaneet sen Mozillan sieniluolaan (joka on tuttu Firefox Realityn käyttäjille, upean taiteilijan Jasmin Habezai-Fekrin toimesta) ja antaneet kameramanipulaattorin, jonka avulla voimme liikkua kohtauksen ympärillä ja nähdä, että se on 3D-näkymä selaimen sisällöstä.

Servossa on laadukas mediatoisto GStreamer-kehyksen kautta, mukaan lukien äänituki. Tässä katselemme esimerkki MPEG4-videota, joka pyörii käyttöönotetun Unity-soitinrakennuksen sisällä.

Lisäosassa on mukautettava haku. Servon nykyisellä versiolla voidaan katsella monenlaista web-sisältöä, ja parempaa web-yhteensopivuutta työstetään aktiivisesti (siitä lisää alla). Myös WebGL-sisältö toimii.

Miten se toimii

Arkkitehtuuri

Kehityksessä Unityssä käytetään komponenttipohjaista arkkitehtuuria, jossa Unityssä suoritetaan GameObjectkappaleisiin liitettyä käyttäjäkoodia, joka on järjestetty kohtauksiin. Käyttäjät muokkaavat GameObject:ia liittämällä niihin skriptejä, jotka suoritetaan C#-ympäristössä joko Mono runtimea tai IL2CPP ahead-of-time-kääntäjää käyttäen. Unityn tapahtumien elinkaarta voivat käyttää käyttäjän skriptit, jotka periytyvät Unityn C#-luokasta MonoBehaviour. Käyttäjäskriptit voivat kutsua natiivia koodia liitännäisissä (jotka ovat vain käyttöjärjestelmän natiiveja dynaamisia jaettuja objekteja) C#-ajoaikaisen P/Invoke-mekanismin kautta. Itse asiassa Unityn ydin itsessään on toteutettu C++:lla ja se tarjoaa lisäosissa olevalle natiiville koodille toisen joukon C/C++:lla saavutettavia rajapintoja, jotka auttavat joissakin lisäosien matalan tason tehtävissä.

Servo on itsessään monimutkainen ohjelmisto. Suunnitelmallisesti suurin osa sen muusta kuin käyttäjälle suunnatusta toiminnallisuudesta on käännetty Rust-kirjastoon, libservo. Tässä projektin ensimmäisessä vaiheessa käytämme yksinkertaistettua C-yhteensopivaa käyttöliittymää toisessa Rust-kirjastossa nimeltä libsimpleservo2. Tämä kirjasto paljastaa C-kutsuttavia funktioita ja takaisinkutsukoukkuja selaimen ohjaamiseen ja sen ulostulon tarkasteluun. Noin libsimpleservo2 otamme käyttöön natiivit C++-abstraktiot, jotka kapseloivat Unityn säikeiden ja renderöinnin mallin ja paljastavat Unityn kutsuttavan joukon rajapintoja, joita puolestaan käyttävät C#-skriptikomponenttimme.

Selaimen sisällön saaminen Unityyn

Luomme Unityyn objektin, instanssin ServoUnityWindow, kietaistaksemme sisäänsä Instanssin Unityn Texture2D-luokkaa ja kohdellaksemme sitä selaimen sisältöruutunauhan muodossa. Kun käytetään Unityn OpenGL-renderöijää, Texture2D-luokan taustalla on natiivi OpenGL-tekstuuri, ja välitämme OpenGL-tekstuurin ”nimen” (eli ID:n) liitännäiselle, joka sitoo tekstuurin framepuskuriobjektiin, joka vastaanottaa lopullisen sommitellun tekstuurin Servosta.

Koska meillä ei ole määräysvaltaa tekstuurin ja Unity-kontekstin sitomiseen, tämän tekstuurin päivittämiseen käytetään tämänhetkisessä suunnittelussa blit (kopiointi) Servon surfman-chains API:n kautta. Pohjimmiltaan Servon WebRender kirjoittaa käyttöjärjestelmäkohtaiseen pintapuskuriin yhdessä säikeessä, ja sitten tämä pintapuskuri sidotaan vain lukuoikeuksin Unityn renderöintisäikeeseen ja tekstuurin kopiointi tehdään OpenGL-API:n avulla. Esimerkiksi alkuperäisessä macOS-toteutuksessa pintapuskuri on IOSurface, jota voidaan siirtää säikeiden välillä nollakustannuksin, mikä mahdollistaa tehokkaan toteutuksen, jossa selaimen kompositori voi kirjoittaa eri säikeessä kuin Unityssä tekstuurin näyttävä säie.

Ohjaus- ja sivumetatiedot välitetään erikseen joukolla API-rajapintoja, jotka mahdollistavat haun ja navigoinnin URL-osoitteisiin, sivujen otsikoiden päivittämisen ja tavanomaisen taaksepäin/eteenpäin/pysäytys- /kotisivulle-painikevalikoiman.

Koska selaimen sisältö ja kontrollit ovat kaikki viime kädessä Unity-objekteja, rakennettava Unity-sovellus voi sijoittaa, tyylitellä tai ohjata niitä ohjelmallisesti haluamallaan tavalla.

Haasteet

Projektin saaminen tähän vaiheeseen ei ole ollut vailla haasteita, joista osaan vastaamme yhä. Unityn skriptiympäristö toimii pitkälti yksisäikeisesti, lukuun ottamatta renderöintioperaatioita, jotka tapahtuvat erillisessä säikeessä eri tahdissa. Servo sen sijaan synnyttää mahdollisesti kymmeniä kevyitä säikeitä erilaisia tehtäviä varten. Olemme huolehtineet siitä, että Servosta palaavat työkohteet marshaloidaan takaisin oikeisiin Unityn säikeisiin. Vielä on jäljellä joitakin optimointeja, jotka koskevat päätöstä siitä, milloin Unityn tekstuuri päivitetään. Tällä hetkellä se päivittyy vain joka ruutu, mutta olemme lisäämässä API:ta upotusrajapintaan mahdollistaaksemme tarkemman ohjauksen.

Selainteknologian hautomona Servo keskittyy uusien teknologioiden kehittämiseen. Merkittävää teknologiaa, joka on siirtynyt Servosta Firefoxia käyttävään Gecko-moottoriin, ovat muun muassa GPU-pohjainen renderöintimoottori WebRender ja CSS-moottori Stylo. Näistä onnistumisista huolimatta täysi web-yhteensopivuus on edelleen alue, jossa Servolla on merkittävä aukko, sillä olemme keskittyneet ensisijaisesti käyttäjälle tarjottaviin suuriin parannuksiin ja erityiskokemuksiin webin pitkän hännän aikana. Servo-yhteisön viimeaikaiset ponnistelut ovat saaneet aikaan suuria edistysaskeleita Servon web-yhteensopivuudessa, joten odotamme Servon selattavissa olevan webin osajoukon kasvavan edelleen nopeasti.

Kehityssuunnitelmat

Servon tällä hetkellä tukemien alustojen täydellisen valikoiman tukeminen on ensimmäinen jatkokehitysprioriteettimme, ja listan kärjessä ovat Windows Win32- ja Windows UWP -tuki. Monet teistä ovat nähneet Firefox Reality AR for HoloLens 2 -sovelluksemme, ja UWP-tuen avulla voit rakentaa Servosta omia AR-sovelluksiasi HoloLens-alustalle käyttäen samaa taustalla olevaa selainmoottoria.

Haluaisimme myös tukea suurempaa osajoukkoa selaimen täydestä kapasiteetista. Korkealla listalla on usean ikkunan tuki. Työskentelemme parhaillaan laajennuksen valmistumisen parissa libsimpleservo2-rajapinnasta uuteen rajapintaan, jonka avulla sovellukset voivat instansoida useita ikkunoita, välilehtiä ja toteuttaa ominaisuuksia, kuten historiatietoja, kirjanmerkkejä ja muuta.

Tämä ensimmäinen julkaisu keskittyy 2D-verkkosivujen kautta selattavaan verkkoon. Servo tukee myös immersiivistä webiä WebXR API:n kautta, ja tutkimme WebXR:n liittämistä Unityn XR-laitteistotukeen plugin-rajapinnan kautta. Aloitamme tuella 360°-videoiden katselulle, jonka tiedämme Firefox Reality -käyttäjiemme perusteella olevan selaimen ensisijainen käyttötapaus.

Viimein…

Olipa kyseessä sitten mediasoitin, pelin sisäinen käyttöliittymä avoimeen webiin, selain käyttöliittymänä, erityisten web-kokemusten tuominen tai lukemattomat muut mahdollisuudet, emme malta odottaa, että saamme nähdä mielikuvituksellisia tapoja, joilla kehittäjät hyödyntävät Servon tehoa ja suorituskykyä Unityn rakentamissa sovelluksissa.