Rinnakkaislaskennan hyödyntäminen dataorientoituneessa pelimoottorissa
Uusi-Illikainen, Albert (2024)
Uusi-Illikainen, Albert
2024
Julkaisun pysyvä osoite on
https://urn.fi/URN:NBN:fi:amk-2024051010779
https://urn.fi/URN:NBN:fi:amk-2024051010779
Tiivistelmä
Tässä opinnäytetyössä kehitettiin tapoja, joilla rinnakkaislaskentaa voidaan hyödyntää pelimoottoritasolla. Työ tehtiin dataorientoituneen suunnittelun periaatteita noudattavaan pelimoottoriin. Tavoitteena oli suorituskyvyn parantaminen implementoimalla kaksi tapaa jakaa systeemien kuorma säikeiden käsiteltäväksi. Näistä ensimmäinen oli systeemille määritettyjen entiteettien käsittelyn jakaminen useammalle säikeelle. Toisena tapana oli kokonaisten systeemien rinnakkain suorittamisen mahdollistaminen. Työ tehtiin tekijän omaan pelimoottoriprojektiin, Encosy-Engineen, joka on ohjelmoitu käyttäen C++-ohjelmointikieltä.
Kehitystehtävän onnistumisen varmistamiseksi tutustuttiin ensin teoriaan, jonka ymmärtäminen oli kriittistä toteutuksen suunnittelun ja työkalujen valinnan kannalta. Teoriaa avattiin havaintomateriaalin avulla, ja se selvensi myös kehityksen kohteena olevan pelimoottorin toimintaperiaatteita. C++20-standardin tarjoamia työkaluja rinnakkaislaskentaan tutkittiin ja niistä valittiin sopivimmat kehitystehtävän toteuttamiseen. Työn toteutusta ja tavoitteisiin pääsyä testattiin testeillä, joiden tuloksia analysoitiin tarkemmin.
Käytännön toteutus koostui tavoista jakaa systeemin kuorma useamman säikeen suoritettavaksi sekä tavasta päätellä, mitkä systeemit voidaan turvallisesti ajaa rinnakkain. Toteutukseen luotiin oma säiepooli, uusi rinnakkaislaskentaa hyödyntävä systeemiluokka, sekä rajapinta, jonka kautta käyttäjä voi hyödyntää uusia toiminnallisuuksia. Toteutusta testattiin testiskenaarion avulla, jolla mitattiin eri toimenpiteisiin kulunutta aikaa. Eroja yhden säikeen ja useamman säikeen suorituksen välillä analysoitiin.
Tuloksissa oli nähtävissä selkeä suorituskyvyn nousu. Tietyissä tehtävissä saavutettiin reilusti yli seitsemänkertainen parannus, kun systeemi suoritettiin kahdeksalla prosessorin ytimellä yhden sijasta. Testituloksista oli myös analysoitavissa, millaiset tehtävät voidaan suorittaa tehokkaasti usealla säikeellä. Tuloksien perusteella löytyi myös hyviä kohteita jatkokehitykselle. Pelimoottorin tapa käsitellä dataa osoittautui soveltuvan hyvin rinnakkaislaskentaan. Työn perusteella voitiin todeta dataorientoituneen suunnittelun periaatteiden toimivan hyvin rinnakkaislaskennan yhteydessä. This thesis aimed to study parallel computing in game engine development. The work was done on a game engine that follows the principles of data-oriented design. The main goal of improving performance was reached by implementing two new ways to utilize multithreading at the engine level. The first of these was defined as a method to divide the processing of system’s entities into several threads. The second was defined as enabling the execution of entire systems in parallel. The thesis was done using the author’s own game engine project Encosy-Engine. The development was done using the C++ programming language.
To ensure the success of the development task relevant theory was first studied. Examples and other material were used to expand on the written text. The theory was also used to clarify the operating principles of the game engine under development. The tools for parallel computing provided by the C++20-standard were studied, and the most suitable ones were chosen for implementing the development task. The final implementation and performance goals were verified with tests. The test results were also analysed in more detail.
The practical implementation was divided to several parts. A custom thread pool, a new system class utilizing parallel computing and an interface from which the user can utilize the new functions were created. Multiple ways to execute the load of a system in threads were implemented. A way to determine which systems can be safely run in parallel was created. New functionalities were tested with a test scenario. The scenario was made to measure the time spent on executing different systems. The difference between single-threaded and multithreaded systems were analysed.
The goal of improving the performance of the game engine was achieved. The results were analysed and a clear increase in performance could be seen from them. In certain tasks a well over sevenfold improvement was achieved when the system was executed with eight processor cores instead of one. The results were also used to analyse what kind of tasks can be run efficiently using several threads. Good targets for further development were also found. The way the game engine handles data was found to be well suited for parallel computing. The results of the thesis were used to conclude that the principles of data-oriented design work well with parallel computing.
Kehitystehtävän onnistumisen varmistamiseksi tutustuttiin ensin teoriaan, jonka ymmärtäminen oli kriittistä toteutuksen suunnittelun ja työkalujen valinnan kannalta. Teoriaa avattiin havaintomateriaalin avulla, ja se selvensi myös kehityksen kohteena olevan pelimoottorin toimintaperiaatteita. C++20-standardin tarjoamia työkaluja rinnakkaislaskentaan tutkittiin ja niistä valittiin sopivimmat kehitystehtävän toteuttamiseen. Työn toteutusta ja tavoitteisiin pääsyä testattiin testeillä, joiden tuloksia analysoitiin tarkemmin.
Käytännön toteutus koostui tavoista jakaa systeemin kuorma useamman säikeen suoritettavaksi sekä tavasta päätellä, mitkä systeemit voidaan turvallisesti ajaa rinnakkain. Toteutukseen luotiin oma säiepooli, uusi rinnakkaislaskentaa hyödyntävä systeemiluokka, sekä rajapinta, jonka kautta käyttäjä voi hyödyntää uusia toiminnallisuuksia. Toteutusta testattiin testiskenaarion avulla, jolla mitattiin eri toimenpiteisiin kulunutta aikaa. Eroja yhden säikeen ja useamman säikeen suorituksen välillä analysoitiin.
Tuloksissa oli nähtävissä selkeä suorituskyvyn nousu. Tietyissä tehtävissä saavutettiin reilusti yli seitsemänkertainen parannus, kun systeemi suoritettiin kahdeksalla prosessorin ytimellä yhden sijasta. Testituloksista oli myös analysoitavissa, millaiset tehtävät voidaan suorittaa tehokkaasti usealla säikeellä. Tuloksien perusteella löytyi myös hyviä kohteita jatkokehitykselle. Pelimoottorin tapa käsitellä dataa osoittautui soveltuvan hyvin rinnakkaislaskentaan. Työn perusteella voitiin todeta dataorientoituneen suunnittelun periaatteiden toimivan hyvin rinnakkaislaskennan yhteydessä.
To ensure the success of the development task relevant theory was first studied. Examples and other material were used to expand on the written text. The theory was also used to clarify the operating principles of the game engine under development. The tools for parallel computing provided by the C++20-standard were studied, and the most suitable ones were chosen for implementing the development task. The final implementation and performance goals were verified with tests. The test results were also analysed in more detail.
The practical implementation was divided to several parts. A custom thread pool, a new system class utilizing parallel computing and an interface from which the user can utilize the new functions were created. Multiple ways to execute the load of a system in threads were implemented. A way to determine which systems can be safely run in parallel was created. New functionalities were tested with a test scenario. The scenario was made to measure the time spent on executing different systems. The difference between single-threaded and multithreaded systems were analysed.
The goal of improving the performance of the game engine was achieved. The results were analysed and a clear increase in performance could be seen from them. In certain tasks a well over sevenfold improvement was achieved when the system was executed with eight processor cores instead of one. The results were also used to analyse what kind of tasks can be run efficiently using several threads. Good targets for further development were also found. The way the game engine handles data was found to be well suited for parallel computing. The results of the thesis were used to conclude that the principles of data-oriented design work well with parallel computing.