Az elmúlt a napokban a Function-re készült demó portolásával foglalkoztam. A cél a PC-re elérhető másik két jelentősebb operációs rendszer volt: Linux és MacOS - mindkettő 64 bites verzióban. Azért esett a választásom ezekre, mert bár Android portom létezik, de az ottani irányítás még mindig kísérleti fázisban van.
Mivel az enginem külön könyvtárként fordul a portolás feladata leegyszerűsödik a platform-specifikus kódok megírására ill. CMake rendszer bővítésére - igen, felmerült már bennem SDL (vagy hasonló SDK) használata.
Amire minimálisan szükségem van:
- Fejlesztői projekt létrehozása
- OpenGL kontext létrehozása - értelemszerűen rendereléshez
- OpenAL kontext létrehozása - értelemszerűen hangkezeléshez
- ablak események kezelése - átméretezés, fullscreen, létrehozás, bezárás
- input események (egér, billentyűzet) kezelése - játék irányítása
- saját könyvtár kezelése - honnan lehet file-okat olvasni ill. írni
- időkezelés - fps független játék szimuláció
Elöljáróban annyit, hogy minden portolás (jelentős) mennyiségű kereséssel, kutatással indul emiatt sok türelemre van hozzá szükség. Az alábbiakban összeszedtem melyik funkcióra mit használok.
Linux
Sokan szeretik, sokan szidják. Rengeteg változat, mindenféle külalak. Első nekifutásra elrettentő lehet, hogy sokat kell vadászni development csomagokra, de elég gyorsan meg lehet találni azt amire szükségünk van és onnan már csak apt-get install. De a meglepetés majd a végén jön.
- CMake -> CodeBlocks - Unix Makefiles
- Xlib (XWindow + glX)
- Magamnak fordítom az OpenAL-t ALSA backend-del shared library-ba
- Xlib - nincs minden lekezelve
- Xlib ( XPending, XNextEvent)
- saját fejlesztői könyvtár vagy exe melletti könyvtár keresése
- gettimeofday
Miután elkészült az exe és az OpenAL.so jöhetnek az apró meglepetések. Ezek javarészt számomra kisebb-nagyobb meglepetések, aki jobban ismeri a Linuxot annak valószínűleg nem lesznek azok.
- OpenAL.so
- a shared library kezelése nem olyan, mint Windows alatt vagyis alapesetben az OS nem keresi az so-t az exe mellett. Mégis ezt a működést az alkalmazás fordításkor be lehet állítani pár linker flagen (rpath) keresztül. Így már szabadon másolhatjuk az exe + so párost bárhová.
- meg lehetne tenni, hogy függőségnek megadom az OpenAL-t, de az kötelező telepítéssel járna - és mi történik ha adott disztróhoz már/még nincs OpenAL?
- glibc
- a glibc minimális verzió követelményt megadja az adott disztró. Ha "túlontúl új" a disztró kompatibilitási problémék lépnek fel. Vagyis minél régebbi disztrón kell fordítani (wtf?) vagy rendszer update kell a futtatáshoz (wtf?) vagy kiadni a forráskódot.
- GL driver
- röviden: Nvidiával legtöbbször oké a helyzet, Amdvel legtöbbször nem oké a helyzet. Többet nem is mondanék...
- sscanf
- a "length modifier" nem úgy működik ahogy máshol emiatt nem használok ilyet
- elterjedtség
- mindenféle internetes forrás szerint a Linux elterjedtsége mindössze 1-2 % körül mozog. Vajon mennyien használják játékra is? Érdemes-e portolni főleg ismerve a GL driverek minőségét?
MacOS
Ez is eléggé megosztja az embereket, de jóval népszerűbb a Linuxnál - elterjedtsége 6-7 % körül van (itt is kérdés, hogy a játékosok között mennyire népszerű). Telepíteni szerencsére semmit nem kell (én csak svn klienst raktam fel pluszban). A platformra történő fejlesztésnek meglehetősen egyedi (és valljuk be elrettentő) vonást ad, hogy a saját framework-jeit csak Objective C-ben lehet elérni. Vagyis a framework használata mellé még egy újabb programozási nyelvet is el kell sajátítani valamilyen szinten. Nagy könnyebbség, hogy a fordító az Obj C kódot együtt tudja kezelni C/C++ kóddal.
- CMake -> Xcode
- NSOpenGLView
- Apple támogatja OpenAL-t vagyis nem szükséges (de lehet) azt lefordítani.
- NSWindow
- NSOpenGLView NSResponder függvényeinek megvalósítása / felülírása
- NSBundle, NSDocumentDirectory
- CVDisplayLink
Összességében pozitív meglepetés a fejlesztés erre a platformra - persze miután átküzdötte magát az ember a (kezdeti) nehézségeken ill. megszokta a környezet sajátosságait. Érdekesség, hogy régebbi verzióban még elérhető volt az Xlib így nem volt szükséges Obj C használata - ez természetesen szabálytalan gyakorlat volt.
Szintén egy előny, hogy az iOS-re fejlesztés (nem meglepő módon) nagyban hasonlít a MacOS-hez.
Bináris csomagok kérésre elérhetőek.
Végezetül - számomra - a Linux inkább "ellenség", a MacOS inkább "barát" és még két screenshot:
- Linux - virtuális gépen futtattam (és fejlesztettem) - OpenGL: Humper - Chromium
- MacOS - régi MacBook - OpenAL: Apple Computer Inc. - Software