Szabadulószoba óra, help rendszer

Alex - 1 éve

Hogy jutottunk el a jelenlegi verzióig?

  • A legelső verzió még azelőtt készült el, hogy én a céghez kerültem volna. Az még egy böngésző felületen futott, ahol gombnyomásra megnyílt egy új ablak. Ezt az ablakot pedig áthúzták egy másik monitorra ami a szobában volt felszerelve. Ez a verzió videót se tudott még lejátszani.
  • A második verzió pythonban készült el egy volt kolléga által, és ő tartotta karban. Ez már MQTT protokollon keresztül kommunikált egy önálló programként, és videót is tudott már lejátszani. Raspberry Pi 3-on futott.
  • A harmadik verzió szintén pythonban készült, újraírásának oka, hogy a pythonos kolléga elment. A rendszer kódja pedig nehezen volt karbantartható és új szobára szabni egyedi felületet rá se tűnt egyszerű feladatnak. Ennél a verziónál a Pygame-re építettünk. Rengeteg optimalizáció került a rendszerbe. Például egy olyan algoritmus ami csak azokon a részeken frissítette a képernyőt ahol történt újrarajzolás. Nem pedig az egész képernyőt frissítettük. Így rengeteg plusz FPS-t nyertünk, ami meg tudott birkózni rengeteg animációval a felületen. Videót szintén tudott lejátszani.

A jelenlegi verzió előtt volt pár kísérletezés, hogy elhagyjuk a pythont. Teszteltünk Flutterben készült rendszereket, de sajnos addig még nem volt rendes támogatás Raspberry Pi-re. WebAsssemblys futtatással pedig nagyon lassan futott a rendszer.

Teszteltünk Javascript alapú game enginek-et is a feladatra. Ez ahogy már a tesztek előtt is sejtettem nem voltak képesek megbirkózni a feladattal.

Végül mi lett a jelenlegi verzió?

A jelenlegi verzió azért tudott elkészülni, mert azóta megjelent a Raspberry Pi 4, amihez kiadták a Vulkan támogatást. Így végül unityben készítettük el. Mivel a unityt szintén nem lehet direktben Raspberry Pi-n futtatni, így a WebGL-es build lett a nyerő megoldás. Könnyedén viszi a Raspberry Pi és elbír a rengeteg mozgó animációval.

Ez a lépés azért volt jó, mert a unity editorral pillanatok alatt összekattingatható a Clock felülete a szobákhoz. Ha szeretnénk akár 3D-s elemeket is tudunk megjeleníteni. Rendelkezésünkre áll a unity teljes eszköztára.

A Unity WebGL buildet pedig egy electron alkalmazásba helyezzük be. Így feltölthető futtatható programként a MinIO-ra ahonnan pedig az App updater kezeli a frissítések telepítését az eszközökön.

Milyen kihívásokkal kellett megküzdeni?

Mivel WebGL-ben sikerült futtatni, így beszorultunk a böngészők általi korlátok közé. Az első legfontosabb probléma az MQTT kapcsolódás volt amit meg kellett oldani, hogy működhessen a program. A unity store-ban találtunk pár megoldást, olyanra volt szükség ami WebGL-ben is működőképes (Mivel böngésző téren maximum Websocketet tudunk használni).

Az első amit kipróbáltunk, nehézkes volt a használata, ráadásul a fejlesztő másnap törölte is az assetet a storeból. Így refundoltuk és kiválasztottunk egy másikat. Egy magyar fejlesztésű assetet sikerült megtalálnunk és kiválóan működik még WebGL buildben is. Az asset itt található: https://assetstore.unity.com/packages/tools/network/best-mqtt-209238

Eleinte egy webserveren futott a Clock, amit csak KIOSK módban betöltöttünk böngészővel az eszközön. Így auto updaterre se lett volna szükség mert egy helyen van a kód. Ez viszont nem bizonyult jó megoldásnak, ugyanis előfordult, hogy nem tudta betölteni a Raspberry Pi az oldalt, és egy üres böngészőablak fogadott minket ami felett nem volt irányításunk, mivel még javascript sem töltődött be. Ezért esett a választás egy Electron wrapperre, amit app updater tud frissíteni hasonlóan a többi programhoz.

Van pár szoba ahol fejjel lefelé lettek beszerelve a monitorok, azért hogy a játékosok ne tudják a kikapcsoló gombját megnyomni. Itt egy olyan problémába futottunk Raspberry Pi rendszer szinten, hogy vagy használtuk a hardveres gyorsítót és cserébe nem lehetett megfordítani a képernyőt. Vagy kikapcsoltuk és akkor forgatható volt a képernyő. Erre a problémára elég egyszerű lett végül a megoldás. Config managementben állítható a Clockokhoz a képernyő megfordítás. Amit unityn belül egész egyszerűen a kamera megfordításával meg lehetett oldani. Így megmaradt a hardveres gyorsítás is.

Videólejátszás terén is akadtak változások. Raspberry Pi 3-ig elérhető volt az OMXPlayer gyárilag telepítve. A régi pythonos rendszerek arra építettek és azt használták videó lejátszására. A Raspberry Pi 4 viszont már VLC-t használ, és nem támogatja az OMXPlayert. Így a régi Clockot át kellett volna írni, hogy ezt használja. Unityhez úgy készítettem el a videó lejátszását, mivel alapból WebGL miatt böngésző környezetben futtatjuk. Sima html5-ös video playert használunk, ami streameli a megfelelő videót a MinIO szerverről.

Szabadulószoba Python Pygame Raspberry Pi Flutter Unity Vulkan Electron OMXPlayer

Olvasnék még ...