PHZ:n koodaaja Mikael Korpinen: Suorituskyky kuntoon Unity 3D:n avulla

3D-simulaatioita hyödyntävässä EU-projektissa oli haasteita suorituskyvyn kanssa. Koodaaja Mikael Korpisen ratkaisu ongelmaan oli opetella lennosta käyttämään Unityn 3D:n uusia dataorientoituneita työkaluja.

EU:n Intermodel-projektissa hyödynnetään 3D-simulaatioita intermodaalisen eli eri kuljetustapoja yhdistävän kuljetuksen tehostamiseksi. Ratkaisin projektissa erityisesti suorituskykyyn ja visualisointiin liittyviä ongelmia.

Projektin haaste oli se, että simulaatiodataa oli aluksi kymmeniä gigatavuja. Kaiken sen lukeminen sekä kolmiulotteisen simulaation luominen kaksiulotteisen tiedon pohjalta oli hidasta tavallisilla työkaluilla.

CSV-muotoiset simulaatiotekstitiedostot eivät auenneet tekstieditoreilla, joten tarvittiin siihen erikoistunut sovellus. Tiedoston luku simulaatiosovellukseen onnistui kirjoittamallani CSV- ja XML-lukijalla.

Lisäksi kirjoitin taulukkolukijan laivoja varten. Tiedon lukeminen tapahtui monisäikeisesti taustalla UniRx-kehyksen avulla.

Koodin optimointi ei riittänyt

Suorituskykyä laski myös Unityn peruspelimoottori, joka on käyttäjälle hyvin oliopohjainen: se hidastaa datapohjaisessa maailmassa ja on myös suhteellisen hidas piirtämään.

Myöskin 3D-malleissa oli ongelmia. 3D-mallien normaalit olivat miten sattui. Vaihtoehtoina oli optimoida ne kääntämällä käsin normaalit oikein päin tai piirtämällä ne kaksipuolisina, mikä olisi vienyt loputkin suorituskyvystä. 

Vanhoissa 3D-malleissa oli muun muassa aukkoja, ja osa ei auennut ehjänä. Lisäksi 3D-mallit olivat CAD-mallien tapaan tuhansissa pienissä osissa.

Ohjelmointipuolella Unityllä ei ollut virallista ratkaisua moottorin moniajoon ja suorituskykyongelmiin, sillä iso osa Unityn rajapinnoista ei ole moniajoturvallisia.

Kokeilin muiden tekemiä monisäikeistyskehyksiä simulaatiodatan prosessointia varten, tehostin toiminnallisuutta tallentamalla ja järjestelemällä tietoa omiin muistialueisiinsa komponenttien sisällä sekä tekemällä algoritmeista älykkäämpiä.

Lisäksi tallensin hakujen tuloksia simulaation luonnin yhteydessä ja poistin pullonkaulat koodista. Ongelma ei silti ratkennut.

Unityn uudet dataorientoituneet kehitystyökalut ratkaisivat kriittisen ongelman

Ratkaisuna Unityn suorituskykyongelmiin opettelin lennosta uuden teknologian: Unityn uuden DOTS-sovelluskehyksen. Sen käyttöönotto vaati projektin kääntämistä Burst Compiler -ystävälliseen muotoon.

Käyttöönotto onnistui yllättävän helposti, eikä pakettien välisiä ongelmatilanteita tullut vastaan. Suorituskykyongelmat ratkaisi osittain myös Universal Render Pipeline, joka on Unityn uusi renderöintiteknologia.

DOTS-sovelluskehyksen avulla sain simulaatiodatan pyörimään pöytäkoneilla satakertaisilla nopeuksilla. 2-ydinkannettavalla simulaatio pyöri 20-kertaisella nopeudella.

Simulaatio pyöritti yhteensä 48 miljoonaa kolmiota varjojen ja PBS-materiaalien kanssa. Sovellus ei tarvinnut erillistä näytönohjainta, vaan toimi Intelin sisäänrakennetuilla suorittimilla.

Katso täältä PHZ Full Stackin avoimet IT-alan työpaikat

PHZ:n Mikael Korpinen erikoisosaamista ovat tietokonegrafiikka ja 3D-ohjelmointi: “Valttikorttejani ovat Unity, Modo ja C#”

Innostuin tietokonegrafiikasta jo teini-ikäisenä isäni jalanjäljissä. Ensimmäinen grafiikkani oli hylje, joka pomputteli palloa. Toteutin sen MAYA-nimisellä 3D-ohjelmalla seuraten ohjelman mukana tulleen kirjan esimerkkejä.

Koulutukseltani olen tuore ohjelmistotekniikan insinööri. Olen työskennellyt monipuolisissa projekteissa pääasiassa tietokonegrafiikan, SDK-kehityksen ja jonkin verran myös web-kehityksen parissa. Toimialoista ovat tulleet tutuiksi muun muassa arkkitehtuuri, simulaatio, rakennusala ja peliteollisuus.

Vapaa-ajallani koodaan peliä ja lisäosia sekä teen 3D-malleja eri käyttötarkoituksiin. Viimeksi olen kehitellyt DOTS/ECS-pohjaista tähtäysjärjestelmää, jolla pystyy löytämään tavaroita ja kohteita ympäristöstä helpommin.

Millainen olet koodaajana?

Kykenen itsenäiseen työskentelyyn, mutta olen hyvä toimimaan myös ryhmässä. Ryhmässä työskentelyssä on mielestäni tärkeää osata vastaanottaa ja antaa palautetta sekä kunnioittaa muiden mielipiteitä ja osaamista.

Vahvuuteni ovat tietokonegrafiikka ja 3d-ohjelmointi. Viime aikoina olen kehittynyt etenkin lisäosa- ja SDK-kehityksessä, monisäikeistyksessä sekä back endissä.

Teknologioista valttikorttejani ovat erityisesti Unity, Modo ja C#. Seuraavat teknologiat, jotka haluan oppia Unity 3D:n ulkopuolelta, ovat Unreal Engine ja sen C++-rajapinnat. En pelkää haasteita.