Simple DirectMedia Layer (SDL)

Fabian Fagerholm

Ohjelmistotuotanto ja tietokonepelit- seminaari Kevät 2006 Tietojenkäsitteltieteen laitos Helsingin yliopisto Sisältö

 Johdanto  Mikä on SDL?  Historia hyvin lyhesti  Open  API: katsaus SDL:n toimintoihin  Arkkitehtuuri  Liitokset korkeamman tason kieliin  Case Johdanto: Mikä on SDL?

 SDL on matalan tason multimediakirjasto.  Äänentoisto  Näppäimistön lukeminen  Peliohjaimen lukeminen  Grafiikan tuottaminen (2D)  OpenGL-yhteensopiva (3D)  Järjestelmärutiinit (rinnakkaisohjelmointi, tapahtumahallinta, jne.)  SDL on siirrettävä, eli toimii monella laitteistoalustalla.  Mahdollistaa pelinteon usealle alustalle samanaikaisesti.  Mahdollistaa pelin siirtämisen uudelle alustalle myöhemmin.  Toimii yli 10 käyttöjärjestelmässä ja yli 10 laitteistoarkkitehtuurissa. (Onko tarpeellista? Toisaalta, haittaako?) Johdanto: Historia hyvin lyhyesti

 SDL:n ensimmäisen version kehitti Sam Lantinga, silloin Loki Softwaren työntekijä.  Loki teki -versioita Windows- ja Mac-peleistä (Sim City 3000 Unlimited, Quake III Arena, ym.).  Peleissä käytettiin mm. SDL:ää.  Yrityksen toiminta loppui vuoden 2002 alussa.  Sam Lantinga edelleen SDL:n pääkehittäjä, nykyään töissä Blizzard Entertainmentilla (World of , II, ym.).  SDL on kirjoitettu :ssä.  Hyvin siirrettävä ja tehokas.  Toimii suoraan C++:ssa.  Helppo tehdä liitoksia muihin kieliin. Johdanto: Open Source

 SDL on Open Source -ohjelmisto (LGPL-lisenssi)  Oman pelin lähdekoodin julkaiseminen ei ole pakollista tietyin ehdoin. Tavoite on pitää SDL vapaasti saatavilla.  Kehitys eroaa suljetun ohjelmiston kehityksestä. Tämä vaatii tietämystä avoimen kehitysmallin käytännöistä.  Kehitystä voi seurata reaaliajassa SDL-projektin koodivaraston kautta. (http://www.libsdl.org/cgi/cvsweb.cgi)  Taustaorganisaation puute saattaa johtaa ajatukseen, että projektiin ei voi luottaa.  Lisenssi kuitenkin mahdollistaa jopa oman version kehittämistä.  Vapaa saatavuus ja avoin kehitysmalli kiinnostaa monia yrityksiä, mm. Nokia kehittää ja julkaisee Open Source-ohjelmistoja.  Ennen kuin käytät: selvitä itsellesi mistä on kyse!  Free Software / Open Source on poikkitieteellinen ilmiö, josta on paljon ristiriitaista tietoa. Sisältö

 Johdanto  API: katsaus SDL:n toimintoihin  Yleiset toiminnot  Grafiikka  Tapahtumien hallinta  Ääni  Rinnakkaisohjelmointi  OpenGL  Arkkitehtuuri  Liitokset korkeamman tason kieliin  Case API: Yleiset toiminnot

 SDL:n API koostuu noin 200 funktiosta ja joukosta struct- rakenteita.  Alustus: SDL_Init  Alustaa SDL:n ja sen alijärjestelmiä (grafiikka, ääni, jne)  Ei tarvitse alustaa kaikkia: • SDL_Init(SDL_INIT_AUDIO | SDL_INIT_VIDEO);  Jaettujen kirjastojen lataaminen: SDL_LoadObject(”libGL.so”);  Mahdollistaa laajennosten lataamisen ajonaikaisesti.  Resurssien vapauttaminen: SDL_Quit();  Sinun on kuitenkin vapautettava kaikki itse varaamasi resurssit. API: Grafiikka

 Suurin osa APIsta liittyy grafiikkaan.  3D-grafiikka on erikseen, nämä ovat 2D-piirtoalueiden toimintoja.  Näytön ja näyttöohjaimen ominaisuudet, näyttötilan asettaminen  Piirtoalueen osittainen päivitys; tuplapuskuroinnin puskurivaihto  Värien hallinta ja eri värijärjestelmien muunnokset  Läpinäkyvyyden säätely avainvärillä tai alpha-kanavalla  Kuvalohko-operaatiot (BLIT, Block Image Transfer)  Hiiriosoittimen operaatiot  OpenGL-toiminnot  Videokuvan overlay-toiminnot API: Grafiikka

 Esimerkki SDL_Surface *image = IMG_Load("SDL_logo.png");

typedef struct SDL_Surface { Uint32 flags; /* surface flags */ SDL_PixelFormat *format; /* pixel format (bits per pixel, etc.) */ int w, h; /* width, height */ Uint16 pitch; /* length of surface scanline in bytes */ void *pixels; /* pointer to pixel data */ SDL_Rect clip_rect; /* surface clipping rectangle */ int refcount; /* used when freeing surface */ /* This structure also contains private fields not shown here */ } SDL_Surface; API: Tapahtumien hallinta

 Tapahtumat ovat käyttäjän tai pelin ulkopuolella olevan järjestelmän aiheuttamia, esim.  Näppäimistön napin painaminen  Hiiren klikkaus tai liikkuminen  Peliohjaimen käyttö  Peli-ikkunan koon muutos  Tapahtumat tallennetaan jonoon.  Peli prosessoi jonon säännöllisesti tai jää odottamaan tapahtumien saapumista.  Prosessoinnissa voi filtteröidä tapahtumia.  Myös omia tapahtumia mahdollista määritellä: SDL_UserEvent  Tarjoaa rungon esim. AI-pelaajan liikkeiden välittämiseen tai testausohjelman synteettisille tapahtumille.  Käytännössä ei sovellu pelilogiikalle? API: Ääni

 SDL:n äänitoiminnot ovat melko vaatimattomat  Äänilaitteiston alustus, resurssien vapautus  Äänidatan muunnos, esim. taajuuden ja näytteiden määrän (samples) muuttaminen laitteistolle sopivaksi  Yksinkertainen miksaus  Toistuva käyttö aiheuttaa säröä ja leikkausta, koska akkumulaattori puuttuu.  3D-pelissä halutaan usein sijoittaa äänet pelimaailmaan, tällöin käytettävä siihen soveltuvaa kirjastoa, esim. OpenAL.  Äänen suunnan simulointi  Voimakkuus riippuen etäisyydestä  Liikkeen vaikutus ääneen (Doppler-vaikutus) API: Rinnakkaisohjelmointi

 Rinnakkaisohjelmointi on työlästä tehdä siirrettäväksi.  SDL tarjoaa yleisimmät rinnakkaisohjelmoinnin työkalut:  Säikeet  Mutex-rakenteet  Semaforit  Ehtomuuttujat  Esim. Linuxissa toteutettu POSIX-säikeillä, jolloin säikeet luodaan käyttöjärjestelmän toimesta ja pystyvät hyödyntämään SMP-ominaisuuksia.  Muissa ympäristöissä mahdollisesti SDL:n sisäinen toteutus (prosessin sisäiset säikeet).  Lisätietoja rinnakkaisohjelmoinnin kirjallisuudesta tai esim. TKTL:n kurssilla Rinnakkaisohjelmointi. API: OpenGL

 SDL ei tarjoa itse 3D-ominaisuuksia  Kiihdytys laitteistoriippuvainen, kehitys hyvin nopea  3D:tä voi ohjelmoida itse OpenGL:n avulla  SDL voi alustaa näytön OpenGL-käyttöä varten  SDL_GL_LoadLibrary, SDL_GL_SetAttribute, ... Sisältö

 Johdanto  API: katsaus SDL:n toimintoihin  Arkkitehtuuri  Modulaarisuus  SDL osana pelimoottoria  Liitokset korkeamman tason kieliin  Case Arkkitehtuuri: modulaarisuus

 SDL on modulaarinen  Rajapinta määrittelee tietorakenteita, joihin operaatiot kohdistuvat  Moduuli voi tarjota rajapintojen luonti- tai muokkausoperaatioita  Modulaarisuus on sopimuksellista – C tai C++ eivät estä käsittelemästä tietorakenteita väärällä tavalla  Standardikirjasto laajentaa toimintoja: SDL_Image, SDL_mixer, SDL_net, SDL_rtf, SDL_ttf  Esimerkki: kuvien tiedostomuotojen tuki SDL_Image-modulissa  Tukee mm. GIF, JPEG, PNG -muotoja  Palauttaa kaikista SDL_Surface-rakenteen  SDL_Surface-rakenne on 2D-grafiikkaoperaatioiden perusrakenne Arkkitehtuuri: SDL osana pelimoottoria

 Ohjelmistotuotannon kannalta koodin uudelleenkäyttö on olennaista  Pelimoottori eristää uudelleenkäytettävät osat pelistä  Grafiikkamoottori (2D ja/tai 3D)  Äänimoottori  Pelimaailman fysiikka  Yleinen logiikka, esim. lautapelilogiikka, ensimmäisen persoonan näkökulmasta kuvattu käytäväjuoksupelilogiikka, ...  Jne.  SDL ei ole pelimoottori, mutta  se voi olla osa sellaista  Loki Softwaren pelit toimi näin Arkkitehtuuri: SDL osana pelimoottoria

 Open Source -pelimoottorin hahmotelma  OpenGL: piilotetaan osittain; hahmojen lataaminen tiedostosta, ym.  OpenAL: hahmo-olioista omat äänilähteet  ODE: Open Dynamics Engine, pelimaailman fysiikan mallinnus  SDL: kytkee palaset yhteen, käyttöjärjestelmätoiminnot, siirrettävyys Sisältö

 Johdanto  API: katsaus SDL:n toimintoihin  Arkkitehtuuri  Liitokset korkeamman tason kieliin  Yleistä  Python /  Case Liitokset: yleistä

 Korkeamman tason kielillä kehitys nopeutuu  Muistinhallintaa ei tarvitse hoitaa itse  Prototyypit voidaan tehdä hyvin nopeasti  Pelimoottori voi sisältää kaikki vaativat toiminnot, pelilogiikka ohjelmoidaan korkean tason kielellä  Liitokset tarjoavat SDL:n toimintoja korkeamman tason kielen toimintoina  Usein liitokset muodostavat hyvin ohuen kerroksen, eli samat funktiot ovat saatavilla, mutta  joskus myös korkeamman tason toimintoja on sisällytetty  SDL:n liitoksia on 20 kielelle, mm. C#, Java, Lua, , PHP, Python, Ruby ja Smalltalk Liitokset: Python / PyGame

 Esimerkkinä PyGame Python-kielelle  Tärkeä ja kiinnostava; Python toimii Symbian Series 60-puhelimissa sekä Nokian 770-laitteessa  PyGame tarjoaa sekä SDL:n matalan tason operaatioita että korkeamman tason omia operaatioitaan  Sprite-luokka: 2D-pelin hahmo  Group-luokka: sisältää monta Sprite-oliota  Surfarray: pikselitason grafiikkaoperaatiot, esim. erikoistehosteisiin  Perinteisen pelisilmukan sijaan PyGame suosittelee Model-View- Controller-suunnittelumalla  Jokaiselle oma säie  Projektitason etuja, kun logiikka ja grafiikka ovat erillään  Verkkopeleissä hajautettuja tietorakenteita on helpompi ohjelmoida erikseen  Testaus helpottuu: yksikkötestien kirjoittaminen PyUnitilla Sisältö

 Johdanto  API: katsaus SDL:n toimintoihin  Arkkitehtuuri  Liitokset korkeamman tason kieliin  Case  Battle for Wesnoth-seikkailupeli Case: Battle for Wesnoth

 Seikkailuaihenen vuorolautapeli  Open Source -projekti, alkoi 2003  Käännöksiä yli 20 kielelle  Siirrettävä: Linux, Windows, Mac OS X, BeOS, Solaris, FreeBSD, OpenBSD, NetBSD  Kirjoitettu C++:ssa  Yli 60000 riviä koodia  2 000 000 USD (COCOMO-Basic) Case: Battle for Wesnoth

 SDL:n toiminnoista rakennettu oliomalli C++:lla  Esimerkki: threading::  Käyttää SDL:n säietoimintoja ... thread::thread(int (*f)(void*), void* data) : thread_(SDL_CreateThread(f,data)) {} ... void thread::join() { if(thread_ != NULL) { SDL_WaitThread(thread_,NULL); thread_ = NULL; } } ... Yhteenveto

 SDL on multimediakirjasto  matalan tason operaatioita  siirrettävyys keskeistä  vapaasti saatavilla, avoin kehitysmalli  API on yksinkertainen, ei korkean tason toimintoja  3D-grafiikkaa varten OpenGL  Modulaarinen arkkitehtuuri  sopimuspohjainen  sopii osaksi pelimoottoria  Runsaasti liitoksia korkean tason kieliin  Oikeasti käytössä  vaatii paljon työtä matalan tasonsa johdosta Lähteet

 Loki Software Inc. ja John R. Hall: Programming Linux Games. No Starch Press, Inc., San Fransisco, CA, USA, 2001.  Erik Yuzwa: Game Programming in C++: start to finish. Charles River Media, Inc., Massachussets, USA, 2006.  Simple DirectMedia Layer Project, Simple DirectMedia Layer: http://www.libsdl.org/  OpenAL Project, OpenAL: http://www.openal.org/  SDL Logo by Arne Claus  Battle for Wesnoth: http://www.wesnoth.org/