praca_magisterska/latex/tex/4-metodologia.tex

141 lines
5.9 KiB
TeX

\clearpage
\section{Metodologia badań i kryteria porównania}
\subsection{Założenia metodologiczne}
\subsubsection{Cel badań}
Głównym celem badań jest porównanie wydajności i możliwości
wybranych silników gier.
\subsubsection{Hipoteza badawcza}
Silnik Unity, dzięki natywnemu wsparciu dla grafiki 2D, osiągnie lepszą
wydajność w~grze typu \emph{bullet hell} niż Unreal Engine, który jest
zoptymalizowany przede wszystkim pod kątem aplikacji 3D.
\subsection{Kryteria porównania}
W ramach testów wydajnościowych analizowano następujące metryki, zbierane
za pomocą narzędzia NVIDIA Nsight Systems:
\begin{itemize}
\item \textbf{Czas klatki} (ang. \emph{frame time}) -- czas potrzebny
na wyrenderowanie pojedynczej klatki, wyrażony w~milisekundach
\item \textbf{Liczba klatek na sekundę} (FPS) -- wartość pochodna
od czasu klatki, kluczowa dla płynności rozgrywki
\item \textbf{Wykorzystanie GPU} -- procentowe obciążenie karty graficznej,
mierzone poprzez liczniki sprzętowe NVIDIA
\item \textbf{Wywołania Vulkan API} -- szczegółowa analiza wywołań
interfejsu graficznego, w~tym funkcji synchronizacji i~prezentacji
\item \textbf{Wywołania systemowe} -- analiza mechanizmów wielowątkowości
i~synchronizacji na poziomie systemu operacyjnego
\end{itemize}
\subsection{Środowisko testowe}
\subsubsection{Specyfikacja sprzętowa}
\label{subsubsec:specyfikacja-sprzetowa}
Wszystkie testy wydajnościowe przeprowadzono na komputerze o następującej specyfikacji:
\begin{itemize}
\item \textbf{Procesor}: AMD Ryzen 9 7900X3D 12-Core Processor (24 rdzenie, 48 wątków)
\item \textbf{Karta graficzna}: NVIDIA GeForce RTX 3090
\item \textbf{Pamięć GPU}: 24 GB GDDR6X
\item \textbf{Sterowniki NVIDIA}: wersja 590.48.01
\item \textbf{Pamięć RAM}: 32 GB
\item \textbf{System operacyjny}: Arch Linux (jądro Linux 6.18.5-arch1-1)
\item \textbf{Dysk}: SSD o pojemności 3,6 TB
\end{itemize}
\subsubsection{Specyfikacja oprogramowania}
\label{subsubsec:specyfikacja-oprogramowania}
W badaniach wykorzystano następujące wersje oprogramowania:
\begin{itemize}
\item \textbf{Unity}: 6.0 (6000.0.58f2) LTS
\item \textbf{Unreal Engine}: 5.5.3
\item \textbf{NVIDIA Nsight Systems}: 2025.5.2
\end{itemize}
Wybór wersji LTS silnika Unity podyktowany był stabilnością oraz długoterminowym wsparciem,
co jest istotne z punktu widzenia powtarzalności badań. W przypadku Unreal Engine
wybrano najnowszą dostępną wersję stabilną w momencie rozpoczęcia badań.
\subsection{Projekt testów}
\subsubsection{Gra testowa typu \emph{bullet hell}}
\label{subsubsec:gra-testowa}
Na potrzeby badań porównawczych zaimplementowano identyczną grę w gatunku
\emph{bullet hell} w obu silnikach. Gra charakteryzuje się następującymi cechami:
\begin{itemize}
\item Sterowana przez gracza postać
\item System generowania przeciwników z progresywnie rosnącym obciążeniem
\item Generowanie wzorców pocisków
\item Wykrywanie kolizji między obiektami
\item Tryb przetrwania trwający 90 sekund
\end{itemize}
Wybór gatunku \emph{bullet hell} podyktowany był możliwością generowania dużej
liczby obiektów na ekranie (pociski, przeciwnicy, efekty wizualne), co
pozwala na skuteczne obciążenie silnika graficznego.
\subsubsection{Fazy obciążenia}
\label{subsubsec:fazy-obciazenia}
Gra testowa została zaprojektowana tak, aby w~ciągu 90 sekund rozgrywki
progresywnie zwiększała obciążenie poprzez:
\begin{itemize}
\item \textbf{Przyspieszanie spawnu przeciwników} -- interwał między
spawnem zmniejsza się liniowo od 0,25~s (początek) do 0,08~s (koniec),
z~dodatkowym ,,finalnym szturmem'' przez ostatnie 5~sekund
\item \textbf{Zwiększanie różnorodności typów przeciwników} -- początkowo
(0--25\% czasu) pojawiają się tylko podstawowi przeciwnicy, później
wprowadzane są kolejno szybsze jednostki (25--50\%), strzelające wieżyczki
(50--75\%) oraz wytrzymałe czołgi (75--100\%)
\item \textbf{Maksymalna liczba przeciwników} -- limit jednoczesnych
przeciwników na scenie wynosi 200 jednostek
\end{itemize}
Na potrzeby profilowania rozgrywka została podzielona na trzy fazy czasowe:
\paragraph{Faza 1 (0--30 sekund)}
Początkowa faza z~niskim obciążeniem. Spawner generuje wyłącznie podstawowych
przeciwników (\emph{Fodder}) z~interwałem ok.~0,25~s.
\paragraph{Faza 2 (30--60 sekund)}
Średnie obciążenie. Wprowadzane są szybsze przeciwnicy (\emph{Runner}),
interwał spawnu zmniejsza się do ok.~0,17~s.
\paragraph{Faza 3 (60--90 sekund)}
Wysokie obciążenie. Wszystkie typy przeciwników (w~tym strzelające \emph{Turret}
i~wytrzymałe \emph{Tank}), interwał spawnu osiąga minimum 0,08~s.
Ostatnie 5~sekund to ,,finalny szturm'' z~maksymalną intensywnością.
\subsubsection{Procedura zbierania danych}
\label{subsubsec:procedura-zbierania}
Przeprowadzono cztery sesje pomiarowe -- po dwie dla każdego silnika:
\begin{enumerate}
\item \textbf{Unity -- tryb statyczny}: Gracz nieruchomy z~włączoną
nieśmiertelnością, pełne 90~sekund rozgrywki profilowane w~jednej sesji
\item \textbf{Unity -- tryb dynamiczny}: Gracz aktywnie poruszający się
i~strzelający, pełne 90~sekund rozgrywki
\item \textbf{Unreal Engine -- tryb statyczny}: Ze względu na ograniczenia
techniczne (awaria przy śledzeniu Vulkan API) rozgrywkę podzielono na
trzy 30-sekundowe fazy, uruchamiane z~flagą \texttt{-{}-start-time=N}
\item \textbf{Unreal Engine -- tryb dynamiczny}: Analogicznie do trybu
statycznego, trzy fazy po 30~sekund z~aktywnym graczem
\end{enumerate}
Narzędzie NVIDIA Nsight Systems rejestrowało:
\begin{itemize}
\item Wywołania Vulkan API (dla Unity -- dla Unreal niemożliwe z~powodu
awarii)
\item Metryki sprzętowe GPU z~częstotliwością 10\,000~Hz
\item Wywołania funkcji systemowych (pthread, futex itp.)
\end{itemize}