Böngésző plugin a Unityhöz

A Unity fejlesztői eszközei és motorja ma már messze a legelterjedtebb módja a VR- és AR-alkalmazások készítésének. Korábban lehetővé tettük, hogy webalapú élményeket exportáljunk a Unityből. Ma izgatottan mutatunk be néhány korai munkát, amely a Unity-fejlesztők által a web használatának másik módjával foglalkozik: komponensként a Unity-alapú virtuális környezetükben.

A böngészőmotor számos platformra és beágyazási forgatókönyvre – többek között Firefox Reality AR-ként a HoloLens 2 számára – történő portolásán végzett munkánkra építve egy új Unity-komponenst építettünk, amely a Servón, egy modern, Rust nyelven írt webmotoron alapul.

A Unity motor egy nagyon jól adaptálható, többplatformos bővítményrendszerrel rendelkezik, amelyhez harmadik féltől származó, nyílt forráskódú és szabadalmaztatott bővítmények egészséges ökoszisztémája tartozik. A plugin rendszer lehetővé teszi, hogy OS-natív modulokat futtassunk, és közvetlenül összekapcsoljuk őket a Unity szkriptkörnyezetben futtatott komponensekkel.

A kísérletek célja egy Unity natív plugin és egy sor Unity C# szkriptkomponens létrehozása volt, amelyek lehetővé teszik harmadik felek számára a Servo böngészőablakok beépítését a Unity jelenetekbe, és opcionálisan támogatást nyújtanak a böngészőfelület használatához a Unityben épített VR és AR alkalmazásokban.

Ma kiadjuk a Servo webböngésző teljesen működőképes prototípusát, amely egy Unity pluginon belül fut. Ez egy korai fázisban lévő betekintés a munkánkba, de tudjuk, hogy nagy az izgalom egy ilyen megoldás iránt, ezért reméljük, hogy kipróbáljátok ezt a prototípust, visszajelzéseket adtok, és csatlakoztok hozzánk, hogy dolgokat építsünk vele. A ma kiadott verzió a macOS platformot célozza, de hamarosan a Servo által támogatott többi platformot is hozzáadjuk.

Kezdjük el

A bővítményt nyílt forráskóddal láttuk el, a https://github.com/MozillaReality/servo-unity címen. Menj át, kattints a csillagra és forkold a kódot, ellenőrizd a helyi gépeden, majd nyisd meg a projektet a Unityn belül.

A fejlesztői utasítások a repositoryban található README fájlban találhatók.

Mit csinál

A Unity Editoron belül közvetlenül a böngészőablakkal és a vezérlőkkel dolgozhatsz. A legfelső szintű konfiguráció a ServoUnityController objektumon található. A jelenet további fontos objektumai a ServoUnityWindow, ServoUnityNavbarController és ServoUnityMousePointer.

A ServoUnityWindow bárhol elhelyezhető a Unity jelenetben. Itt a Mozilla gombabarlangjába dobtuk (a Firefox Reality felhasználói számára ismerős, a csodálatos Jasmin Habezai-Fekri művész által készített), és egy kameramanipulátort biztosítottunk, amely lehetővé teszi, hogy mozogjunk a jelenetben, és lássuk, hogy az a böngésző tartalmának 3D-s nézete.

A Servo a GStreamer keretrendszeren keresztül kiváló minőségű médialejátszással rendelkezik, beleértve a hangtámogatást is. Itt egy MPEG4-es videómintát nézünk meg, amely egy telepített Unity lejátszó build-en belül fut.

A bővítményben testreszabható keresés is található. A Servo jelenlegi verziójával a webes tartalmak széles választéka megtekinthető, a nagyobb webes kompatibilitáson aktívan dolgoznak (erről bővebben alább). A WebGL-tartalmak is működnek.

Hogyan működik

Architektúra

A Unityben a fejlesztés komponensalapú architektúrát használ, ahol a Unity a GameObjectokhoz csatolt, jelenetekbe szervezett felhasználói kódot hajtja végre. A felhasználók a GameObject-okat szkriptek csatolásával testreszabják, amelyek C# környezetben futnak, vagy a Mono futtatási idővel, vagy az IL2CPP idő előtti fordítóval. A Unity esemény életciklusa elérhető a MonoBehaviour Unity C# osztályból öröklődő felhasználói szkriptek számára. A felhasználói szkriptek a C# futási idő P/Invoke mechanizmusán keresztül hívhatják meg a pluginekben lévő natív kódot (amelyek nem mások, mint OS-natív dinamikus megosztott objektumok). Valójában maga a Unity magja is C++ nyelven van implementálva, és a pluginekben lévő natív kódot egy második, C/C++ nyelven elérhető interfészkészlettel látja el, hogy segítse a plugin egyes alacsony szintű feladatait.

A Servo maga is egy összetett szoftver. Tervezése szerint a legtöbb nem felhasználóbarát funkciója egy Rust könyvtárba van fordítva, libservo. A projekt ezen első fázisában egy egyszerűsített C-kompatibilis interfészt használunk egy másik libsimpleservo2. nevű Rust könyvtárban Ez a könyvtár C-ben hívható függvényeket és visszahívási horgokat állít ki a böngésző vezérléséhez és a kimenetének megtekintéséhez. A libsimpleservo2 körül olyan natív C++ absztrakciókat hozunk létre, amelyek a szálak és a renderelés Unity-modelljét kapszulázzák, és egy Unityvel hívható interfészkészletet tesznek közzé, amelyet viszont a C# szkriptkomponenseink működtetnek.

A böngésző tartalmának bevitele a Unitybe

Létrehozunk egy objektumot a Unityben, a ServoUnityWindow egy példányát, hogy a Unity Texture2D osztályának egy példányát becsomagoljuk és a böngésző tartalomablakaként kezeljük. A Unity OpenGL renderelőjének használatakor a Texture2D osztály mögött egy natív OpenGL textúra áll, és az OpenGL textúra “nevét” (azaz egy azonosítót) átadjuk a plugin számára, amely a textúrát egy framebuffer objektumhoz köti, amely megkapja a végleges kompozitált textúrát a Servótól.

Mivel nincs kontrollunk a textúra és a Unity-kontextus kötése felett, a jelenlegi terv a textúra frissítésére a Servo surfman-chains API-n keresztül egy blit-et (másolást) használ. Lényegében a Servo WebRender egy szálon egy OS-specifikus felületpufferbe ír, majd ez a felületpuffer olvashatóan a Unity renderelő szálához van kötve, és a textúra másolása az OpenGL API-k segítségével történik. A kezdeti macOS implementációban például a felületi puffer egy IOSurface, amely zéró költséggel mozgatható a szálak között, lehetővé téve egy hatékony implementációt, ahol a böngésző kompozitora egy másik szálban írhat a textúrát megjelenítő szálhoz képest a Unityben.

A vezérlés és az oldal metaadatai külön kommunikálódnak, egy sor API-n keresztül, amelyek lehetővé teszik a keresést és a navigációt az URL-ekhez, az oldalcímek frissítését és a szokásos vissza/előre/stop/home gombkészletet.

Mivel a böngésző tartalma és a vezérlőelemek végső soron mind Unity objektumok, az épülő Unity alkalmazás tetszőleges módon pozícionálhatja, stilizálhatja vagy programozottan vezérelheti ezeket.

Kihívások

A projekt eljutása ebbe a szakaszba nem volt mentes a kihívásoktól, amelyek egy részével még mindig foglalkozunk. A Unity szkriptkörnyezete nagyrészt egyszálasan fut, kivéve a renderelési műveleteket, amelyek egy külön szálon, más ütemben zajlanak. A Servo azonban potenciálisan több tucat könnyű szálakat hoz létre a különböző feladatokhoz. Gondoskodtunk arról, hogy a Servóból visszatérő munkaelemeket a megfelelő szálakhoz rendeljük vissza a Unityben. Van még néhány optimalizálandó feladat annak eldöntésében, hogy mikor frissítsük a Unity textúráját. Jelenleg csak minden képkockán frissül, de a beágyazási felülethez hozzáadunk egy API-t, amely finomabb vezérlést tesz lehetővé.

A Servo a böngészőtechnológia inkubátoraként az új technológiák fejlesztésére összpontosít. A Servótól a Firefoxot működtető Gecko motorba átkerült nevezetes technológiák közé tartozik a GPU-alapú renderelőmotor, a WebRender és a CSS-motor, a Stylo. Ezeket a sikereket leszámítva a teljes webes kompatibilitás még mindig egy olyan terület, ahol a Servo jelentős lemaradásban van, mivel mi elsősorban a felhasználók számára nyújtott nagy fejlesztésekre és konkrét tapasztalatokra összpontosítottunk a web hosszú farkán. A Servo közösség közelmúltbeli erőfeszítései nagy előrelépést hoztak a Servo webkompatibilitásában, így arra számítunk, hogy a web Servo által böngészhető részhalmaza továbbra is gyorsan növekszik.

Kidolgozási tervek

A Servo által jelenleg támogatott platformok teljes skálájának támogatása az első további fejlesztési prioritásunk, a Windows Win32 és Windows UWP támogatással a lista élén. Sokan látták már a Firefox Reality AR for HoloLens 2 alkalmazásunkat, és az UWP-támogatás lehetővé teszi, hogy a Servo-t saját AR-alkalmazásokba építsük be a HoloLens platformra, ugyanazt a mögöttes böngészőmotort használva.

A teljes böngésző képességének egy nagyobb részhalmazát is szeretnénk támogatni. A lista élén a több ablakos támogatás áll. Jelenleg azon dolgozunk, hogy a bővítményt a libsimpleservo2 interfészről egy új interfészre fejlesszük, amely lehetővé teszi, hogy az alkalmazások több ablakot, lapokat instanciáljanak, és olyan funkciókat valósítsanak meg, mint az előzmények, könyvjelzők stb.

Ez az első kiadás a 2D-s weblapokon keresztül böngészhető webre összpontosít. A Servo támogatja az immersive webet is a WebXR API-n keresztül, és vizsgáljuk a WebXR összekapcsolását a Unity XR hardvertámogatásával a plugin interfészen keresztül. A 360°-os videók megtekintésének támogatásával fogunk kezdeni, amelyről a Firefox Reality felhasználói bázisáról tudjuk, hogy a böngésző elsődleges felhasználási területe.

Végre…

Legyen szó médialejátszóról, játékon belüli interfészről a nyílt webhez, böngészőről mint felhasználói felületről, egyedi webes élmények beviteléről vagy számtalan más lehetőségről, alig várjuk, hogy lássuk, milyen fantáziadús módon fogják a fejlesztők kihasználni a Servo erejét és teljesítményét a Unity által épített alkalmazásokon belül.