Kierroksen 5 purku

Toiseksi viimeisen tapaamisemme alussa käsittelimme kuvan varsinaisesti piirtämiseen liittyviä aiheita. Olimme jälleen kahden viikon ajan keränneet informaatiota erinäisistä asioista, ja tässä ovat lopputulokset tiivistettyinä:

Animaatio:

Animaatiot ovat käytännössä peräkkäin näytetty sarja kuvia, joita tarpeeksi nopeasti vaihtamalla saadaan ihmiselle luotua illuusio liikkeestä. Usein sanotaan, että kuvia on tietty määrä sekunnissa (frames per second), ja sen avulla voidaan hieman vertailla animaatioiden sulavuutta. Toteutustapoja on Scalassa useita, mutta yksinkertaisinta lienee päivittää näytölle piirrettävien Image-olioiden kuvaa tarvittaessa. Siinä on kuitenkin lukuisia puutteita – uudelleenpiirrettäessä ei voida suorittaa muuta ohjelmakoodia, animaation ajoitus oikeaan aikaan on vaivalloisempaa ja etenkin pelien toteuttaminen näin on ongelmallista.

Monella tapaa parempi ratkaisu olisi hyödyntää säikeitä. Luomalla Thread -olio ja jättämällä animaatioiden ylläpitäminen täysin sen huoleksi, saadaan ajoitus paljon helpommin toteutettua, samanaikaisesti suoritettua muiden objektien ohjelmakoodia sekä renderöidä kuvaa efekteillä haluttaessa. Kuitenkin sykronointi pääohjelman koodin suorittamisen vaiheiden kanssa voi olla erittäin olennaista tällä tavoin.

Canvasia käyttävä Graphics2D on hidas, kun piirrettäviä kuvaolioita on paljon. OpenGL on nopeampi monissa tilanteissa, ja muut menetelmät voivat olla tilanteesta riippuen vielä nopeampiakin. Tämä tuskin tulee kuitenkaan ongelmaksi, ellei luoda ohjelmia esimerkiksi puhelimille tms.

2D-grafiikka Scalassa

Scalassa ei ole natiiveja grafiisia ominaisuuksia, vaan kaikki piirtämistoiminnot tulevat suoraan Javan kirjastoista. Abstract Window Toolkit eli AWT ja Swing ovat Javan kaksi 2D-grafiikan kannalta erittäin olennaista pakettia. Niissä on paljon samanlaisia piirto-ominaisuuksia ja ne osittain käyttävät samoja luokkiakin, mutta erittäin olennainen ero tulee käyttöliittymän suunnittelun kanssa.

AWT ottaa käyttöliittymän ikkunaelementtien tyylit suoraan käyttöjärjestelmän omista tyyleistä, kun taas Swing piirtää ikkunaelementit omista tyyleistään. Muun muassa ongelmia aiheuttaa AWTia käyttävien ohjelmien porttaus, sillä eri käyttöjärjestelmissä ikkunaelementit voivat näyttää hyvinkin erilaisilta. Swingillä tehdyt ohjelmat sen sijaan näyttävät huomattavasti yhtenäisemmiltä eri käyttöjärjestelmien välillä. Tästä on etua, sillä ikkunaelementtien tyyli sisältää informaatiota mm. siitä, minkä kokoisia ja näköisiä erilaiset napit ja valikot ovat. Jos ero on kovin suuri, voi tarkkaan suunniteltu käyttöliittymä näyttää huonolta tai jopa aiheuttaa hankaluuksia muilla tietokoneilla käytettäessä.

Swing

Swing on Scalan peruskirjasto, jonka avulla on helppo rakentaa monenlaisia käyttöliittymiä. Sen luokat sisältävät määrittelyjä ja metodeja mm. nappuloiden, tekstikenttien, valikoiden ja valintalaatikoiden luomiseen ja käyttöön. Nämä käyttöliittymäelementit sitten jaetaan paneeleihin, joilla voidaan tarkemmin valikoida niiden sijaintia ruudulla.

Ne osaavat myös kuunnella erilaisia inputin tapahtumia, kuten hiirellä klikkausta tai näppäimistön käyttöä, ja heittävät tiedon käyttäjän tekemistä asioista tapahtumakuuntelijalle. Kuuntelija sitten suorittaa erilaisia metodeja riippuen siitä, mitä tapahtui ja missä. Tällä tavoin saadaan esimerkiksi toimintoja käyttöliittymässä olevaa nappia painettaessa.

OpenGL ja renderöinti

Open Graphics Library, eli OpenGL on ohjelmistorajapinta, joka sisältää lukuisan määrän funktioita 2D- ja 3D-grafiikan luomiselle. Se on käyttäjästä ja käyttöjärjestelmästä riippumaton, sillä OpenGL-funktiot pelkästään käsittelevät kuvien tehokasta renderöintiä. Puhtaasti grafiikkaa käsittelevänä kirjastona OpenGL:n avulla ei siis pysty hoitamaan esimerkiksi standardien mukaisten ikkunakomponenttien tekoa, elementtien kuuntelemista tai muita vastaavia toimintoja. Vaihtoehtoisia rajapintoja on myös; pienempiä kuvien renderöintiin pureutuvia kirjastoja on lukuisia, ja eräs olennainen kilpailija on Microsoftin DirectX.

Renderöinti on kuvadatan luomista aiemman datan avulla, noudattaen tietynlaista mallia. 3D-grafiikan yhteydessä termillä viitataan mm. realististen valoefektien kirkkauksien laskemiseen. Videoiden renderöinnissä voidaan kuvasarjan jokaiseen kuvaan lisätä jonkinlainen efekti erilaisten filttereiden avulla, jotta saadaan esimerkiksi kuvasta terävämpää tai poistettua epähaluttuja asioita siististi. Esimerkiksi pelien yhteydessä reaaliaikaisesti useita kuvia peräjälkeen renderöidessä joudutaan säästelemään efektien hienoudesta, sillä aikaa yksittäisen kuvan luomiseen saattaa olla vain sekunnin murto-osa.

– Esa Koskinen