\documentclass{beamer}
\usepackage[fontsize=17pt]{fontsize}
\usepackage{graphicx}
\usepackage{tikz}
\usepackage{svg}
\usepackage[polish]{babel}
\usepackage{booktabs}
\usepackage{colortbl}
\usepackage{multirow}
\usepackage{amssymb}
\graphicspath{ {./images/} {../../latex/tex/img/} }
\usetheme{Warsaw}

%Information to be included in the title page:
\title{\large Porównanie wydajności i możliwości \\ współczesnych silników gier komputerowych}
\author{inż. Krzysztof Rudnicki}
\institute{
    \textbf{Promotor:} dr inż. Michał Chwesiuk \\[0.3em]
    Wydział Elektroniki i Technik Informacyjnych \\
    Politechnika Warszawska
}
\date{\scriptsize 10 marca 2026}

\setbeamertemplate{footline}[frame number]{}
\beamertemplatenavigationsymbolsempty
\setbeamertemplate{headline}{}

\begin{document}

%==============================================================================
% TITLE
%==============================================================================
\begin{frame}
  \vspace{-0.5cm}
  \maketitle
\end{frame}

%==============================================================================
% TABLE OF CONTENTS
%==============================================================================
\begin{frame}
\frametitle{Plan prezentacji}
\tableofcontents
\end{frame}

%==============================================================================
% SECTION 1: MOTIVATION AND GOALS
%==============================================================================
\section{Cel i zakres pracy}

\begin{frame}
  \frametitle{Motywacja}
  \begin{itemize}
    \item Rynek gier zdominowany przez dwa silniki:
    \begin{itemize}
      \item \textbf{Unity} -- prawie 25\,000 gier na Steam
      \item \textbf{Unreal Engine} -- ponad 7\,500 gier na Steam
    \end{itemize}
    \item Brak systematycznych badań porównawczych
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Cel pracy}
  \begin{enumerate}
    \item Testy wydajności z~NVIDIA Nsight Systems
    \item Implementacja identycznej gry w obu silnikach
    \item Analiza porównawcza funkcjonalności
    \item Wywiady z~8 deweloperami gier
  \end{enumerate}
\end{frame}

\begin{frame}
  \frametitle{Hipoteza}
  \vspace{1cm}
  \centering
  \large
  Unity osiągnie lepszą wydajność w~grze 2D \emph{bullet hell} dzięki natywnemu wsparciu dla grafiki 2D.
\end{frame}

%==============================================================================
% SECTION 2: METHODOLOGY
%==============================================================================
\section{Metodologia}

% SKRYPT: Wybór gatunku -- bullet hell
% Uzasadnienie:
% - Setki/tysiące pocisków na ekranie
% - Test zarządzania pamięcią (GC vs ręczne)
% - Intensywne wykrywanie kolizji
% - Skalowalność obciążenia
% - Prosta koncepcja -> fokus na wydajność
{
  \setbeamercolor{footline}{fg=white}
  \usebackgroundtemplate{
    \includegraphics[width=\paperwidth, height=\paperheight]{touhou.jpg}}
  \begin{frame}
  \end{frame}
}

\begin{frame}
  \frametitle{Parametry gry testowej}
  \begin{itemize}
    \item Czas rozgrywki: \textbf{90 sekund}
    \item 3 typy przeciwników z różnymi wzorcami strzelania
    \item Eskalacja trudności w 3 fazach
    \item Limit: 200 jednoczesnych przeciwników
    \item Interwał spawnu: 0,25s $\rightarrow$ 0,08s
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Środowisko testowe}
  \begin{table}
    \centering
    \footnotesize
    \renewcommand{\arraystretch}{1.1}
    \begin{tabular}{@{}ll@{}}
      \toprule
      CPU & AMD Ryzen 9 7900X3D \\
      GPU & NVIDIA RTX 3090 (24 GB) \\
      RAM & 32 GB \\
      OS & Arch Linux \\
      Unity & 6.0 LTS \\
      Unreal & 5.5.3 \\
      Profiler & NVIDIA Nsight Systems 2025.5.2 \\
      \bottomrule
    \end{tabular}
  \end{table}
\end{frame}

%==============================================================================
% SECTION 3: IMPLEMENTATION
%==============================================================================
\section{Implementacja}

\begin{frame}
  \frametitle{Implementacja -- Unity}
  \begin{itemize}
    \item Język: \textbf{C\#}
    \item Natywny tryb 2D
    \item \texttt{Rigidbody2D}, \texttt{Collider2D}
    \item Object pooling: \texttt{SetActive()}
    \item Hot reload
    \item Instalacja: $\sim$30 min
  \end{itemize}
\end{frame}

{
  \setbeamercolor{footline}{fg=white}
  \usebackgroundtemplate{
    \includegraphics[width=\paperwidth, height=\paperheight]{unity_game.png}}
  \begin{frame}
  \end{frame}
}

\begin{frame}
  \frametitle{Implementacja -- Unreal Engine}
  \begin{itemize}
    \item Język: \textbf{C++} / Blueprinty
    \item ,,Fałszywe 2D'' w środowisku 3D
    \item Object pooling -- 3 metody:
    \begin{itemize}
      \scriptsize
      \item \texttt{SetActorHiddenInGame}
      \item \texttt{SetActorEnableCollision}
      \item \texttt{SetActorTickEnabled}
    \end{itemize}
    \item Instalacja: $\sim$2--4h (Linux)
  \end{itemize}
\end{frame}

{
  \setbeamercolor{footline}{fg=white}
  \usebackgroundtemplate{
    \includegraphics[width=\paperwidth, height=\paperheight]{unreal_game_view.png}}
  \begin{frame}
  \end{frame}
}

\begin{frame}
  \frametitle{Porównanie doświadczeń implementacyjnych}
  \begin{table}
    \centering
    \small
    \begin{tabular}{lcc}
      \toprule
      \textbf{Aspekt} & \textbf{Unity} & \textbf{Unreal} \\
      \midrule
      Instalacja (Linux) & $\sim$30 min & $\sim$2--4 h \\
      Natywne 2D & Tak & Nie \\
      Język & C\# & C++ \\
      Próg wejścia & Niski & Średni/Wysoki \\
      Czas kompilacji & Szybki & Wolny \\
      Object pooling & Prosty & Złożony \\
      Hot reload & Tak & Ograniczony \\
      \bottomrule
    \end{tabular}
  \end{table}
\end{frame}

%==============================================================================
% SECTION 4: PROFILING TOOL
%==============================================================================
\section{Narzędzie profilowania}

% SKRYPT: Dlaczego nie wbudowane profilery?
% Wbudowane profilery silników są nieporównywalne:
% - Różna definicja metryk
% - Różny narzut profilowania
% - Różne formaty wyjściowe
\begin{frame}
  \frametitle{Dlaczego NVIDIA Nsight Systems?}
  \begin{itemize}
    \item NVIDIA Nsight -- niezależne narzędzie:
    \begin{itemize}
      \item Zunifikowane metryki sprzętowe
      \item Analiza na poziomie Vulkan API
      \item Minimalny narzut (poziom sterownika)
      \item Spójny format dla obu silników
    \end{itemize}
  \end{itemize}
\end{frame}

{
  \setbeamercolor{footline}{fg=white}
  \usebackgroundtemplate{
    \includegraphics[width=\paperwidth, height=\paperheight]{nvida_nsighty.jpg}}
  \begin{frame}
  \end{frame}
}

%==============================================================================
% SECTION 5: PERFORMANCE RESULTS
%==============================================================================
\section{Wyniki testów wydajności}

\begin{frame}
  \frametitle{Unity -- wydajność klatek}
  \begin{table}
    \centering
    \footnotesize
    \renewcommand{\arraystretch}{1.1}
    \begin{tabular}{@{}lr@{}}
      \toprule
      Czas testu & 94,16 s \\
      Wyrenderowane klatki & 13\,556 \\
      Średni FPS & 143,96 (V-Sync: 144 Hz) \\
      Mediana czasu klatki & 6,94 ms \\
      99. percentyl (1\% low) & 7,58 ms (132 FPS) \\
      Klatki w 5--10 ms & \textbf{98,24\%} \\
      IQR czasu klatki & 0,08 ms \\
      \bottomrule
    \end{tabular}
  \end{table}
\end{frame}

\begin{frame}
  \frametitle{Unity -- architektura renderowania}
  \small
  \begin{itemize}
    \item \textbf{Prosty potok}: 2 wywołania \texttt{vkQueueSubmit}/klatkę
    \item \texttt{vkWaitForFences} -- \textbf{95,2\%} czasu Vulkan API
    \begin{itemize}
      \item CPU czeka na GPU $\rightarrow$ scenariusz \textbf{GPU-bound}
    \end{itemize}
    \item Łącznie $\sim$218\,815 wywołań Vulkan API
    \item Tylko \textbf{3 potoki graficzne} w~całym teście
    \item Wykorzystanie GPU: \textbf{$\sim$23\%} (ograniczone V-Sync)
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Unreal Engine -- wydajność klatek}
  \begin{table}
    \centering
    \small
    \begin{tabular}{lrrr}
      \toprule
      \textbf{Metryka} & \textbf{Faza 1} & \textbf{Faza 2} & \textbf{Faza 3} \\
      \midrule
      Średni FPS & 332 & 339 & 162  \\
      GPU Active & 91\% & 91\% & 50\% \\
      vkQueueSubmit & 166\,918 & 186\,589 & 74\,393 \\
      Submit/klatkę & 16,2 & 16,2 & 16,2  \\
      \bottomrule
    \end{tabular}
  \end{table}
  \vspace{0.3cm}
  \begin{itemize}
    \item Spadek o~\textbf{ponad 50\%} między fazami 1--2 a~fazą 3
    \item Brak V-Sync -- pełne wykorzystanie GPU
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Unreal Engine -- architektura renderowania}
  \small
  \begin{itemize}
    \item \textbf{Złożony potok}: 16 wywołań \texttt{vkQueueSubmit}/klatkę
    \item Tworzenie potoków: \textbf{47--72\%} czasu Vulkan API
    \begin{itemize}
      \item $\sim$1000 potoków na fazę (vs 3 w Unity!)
    \end{itemize}
    \item Łącznie $\sim$\textbf{32 mln} wywołań Vulkan API
    \item $\sim$\textbf{9 mln} wywołań synchronizacji OS
    \item Intensywne użycie compute shaderów (culling, post-proc.)
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Porównanie kluczowych wyników}
  \begin{table}
    \centering
    \small
    \begin{tabular}{lrr}
      \toprule
      \textbf{Metryka} & \textbf{Unity} & \textbf{Unreal} \\
      \midrule
      Wykorzystanie GPU & 23\% & 91\% / 50\% \\
      Wywołania Vulkan API & $\sim$0,5 mln & $\sim$32 mln \\
      Wywołania sync. OS & 29\,383 & $\sim$9 mln \\
      Potoki graficzne & 3 & $\sim$2\,400 \\
      Submit/klatkę & 2 & 16 \\
      \bottomrule
    \end{tabular}
  \end{table}
\end{frame}

\begin{frame}
  \frametitle{Interpretacja -- Unity}
  \begin{block}{Unity}
    \begin{itemize}
      \item Prosty, dwuetapowy potok -- wydajny dla gier 2D
      \item Stabilne czasy klatek (98,24\% w 5--10 ms)
      \item Niewykorzystany potencjał GPU (V-Sync: 23\%)
    \end{itemize}
  \end{block}
\end{frame}

\begin{frame}
  \frametitle{Interpretacja -- Unreal Engine}
  \begin{block}{Unreal Engine}
    \begin{itemize}
      \item Złożony, wieloetapowy potok -- narzut dla prostych scen
      \item Ciągła rekompilacja potoków (dynamiczna optymalizacja)
      \item Pełne wykorzystanie GPU ($\sim$91\%)
      \item Spadek wydajności przy dużym obciążeniu ($>$50\%)
    \end{itemize}
  \end{block}
\end{frame}

%==============================================================================
% SECTION 6: INTERVIEWS
%==============================================================================
\section{Wywiady z~deweloperami}

\begin{frame}
  \frametitle{Wywiady -- najważniejsze wnioski (1/2)}
  8 respondentów (1--10 lat doświadczenia):
  \vspace{0.2cm}
  \begin{itemize}
    \item \textbf{Próg wejścia}: Unity niższy, Unreal wyższy
    \item \textbf{Dokumentacja}: Unity lepsza (przykłady kodu); Unreal -- ,,szkieletowa''
    \item \textbf{Blueprinty}: Ułatwiają współpracę z~nietechnicznymi, ale problemy z~Git
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Wywiady -- najważniejsze wnioski (2/2)}
  \begin{itemize}
    \item \textbf{Architektura}: Unreal wymusza porządek; Unity -- elastyczny
    \item \textbf{C\# vs C++}: C\# łatwiejszy; C++ w~Unreal ,,niestandardowy''
    \item \textbf{Materiały}: Unity przewaga ilościowa
  \end{itemize}
\end{frame}

%==============================================================================
% SECTION 7: CONCLUSIONS
%==============================================================================
\section{Wnioski}

\begin{frame}
  \frametitle{Weryfikacja hipotezy}
  \textit{,,Unity osiągnie lepszą wydajność w~grze bullet hell~\ldots''}
  \vspace{0.5cm}

  \begin{itemize}
    \item Prostsza architektura renderowania
    \item Stabilniejsze czasy klatek
    \item Łatwiejszy proces implementacji (60\% czasu)
    \item Natywne wsparcie 2D
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Rekomendacje}
  \begin{table}
    \centering
    \footnotesize
    \renewcommand{\arraystretch}{1.1}
    \begin{tabular}{@{}lll@{}}
      \toprule
      \textbf{Projekt} & \textbf{Silnik} & \textbf{Powód} \\
      \midrule
      2D indie & Unity & Natywne 2D \\
      Mobilna & Unity & Optymalizacja \\
      Prototyp & Unity & Szybkie iteracje \\
      3D AAA & Unreal & Nanite, Lumen \\
      VR high-end & Unreal & Oświetlenie \\
      Zespół mieszany & Unreal & Blueprinty \\
      \bottomrule
    \end{tabular}
  \end{table}
\end{frame}

\begin{frame}
  \frametitle{Wkład pracy}
  \begin{enumerate}
    \item \textbf{Zunifikowana metodyka pomiaru} -- \\ Nsight Systems jako niezależne narzędzie
    \item \textbf{Analiza Vulkan API} -- \\ 32 mln wywołań (Unreal) vs 0,5 mln (Unity)
    \item \textbf{Triangulacja metod} -- \\ testy + wywiady + implementacja
    \item \textbf{Praktyczne rekomendacje} -- \\ macierz wyboru silnika
  \end{enumerate}
\end{frame}

\begin{frame}
  \frametitle{Ograniczenia}
  \begin{itemize}
    \item Jeden gatunek gry (bullet hell)
    \item Pojedyncza konfiguracja sprzętowa (high-end)
    \item 8 wywiadów (badanie eksploracyjne)
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Dalsze badania}
  \begin{itemize}
    \item Testy dla RPG, RTS, puzzle
    \item Różne platformy (mobile, konsole, low-end PC)
    \item Automatyczny framework benchmarkowy
    \item Badanie długoterminowe (2--3 lata)
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{}
  \vspace{2cm}
  \centering
  {\Large Dziękuję za uwagę}
  \vspace{1cm}

  {\normalsize Pytania?}
\end{frame}

\end{document}