Simple Directmedia Layer (SDL)
Total Page:16
File Type:pdf, Size:1020Kb
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 Source 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 Linux-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 Warcraft, Diablo II, ym.). SDL on kirjoitettu C: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 / PyGame 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, Perl, 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::thread 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/.