\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}
