mirror of
https://github.com/kuhyx/praca_magisterska.git
synced 2026-07-04 15:23:10 +02:00
466 lines
15 KiB
TeX
466 lines
15 KiB
TeX
\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 Luty 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
|
|
\item Odmienne filozofie projektowe:
|
|
\begin{itemize}
|
|
\item Unity: C\#, garbage collector
|
|
\item Unreal: C++, dostęp do kodu źródłowego
|
|
\end{itemize}
|
|
\end{itemize}
|
|
\end{frame}
|
|
|
|
\begin{frame}
|
|
\frametitle{Cel pracy}
|
|
Porównanie wydajności i~możliwości Unity oraz Unreal Engine:
|
|
\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}
|
|
\vspace{0.5cm}
|
|
\textbf{Hipoteza:} 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}
|
|
|
|
\begin{frame}
|
|
\frametitle{Wybór gatunku -- bullet hell}
|
|
\begin{columns}
|
|
\begin{column}{0.55\textwidth}
|
|
\textbf{Uzasadnienie:}
|
|
\begin{itemize}
|
|
\item Setki/tysiące pocisków na ekranie
|
|
\item Test zarządzania pamięcią \\ (GC vs ręczne)
|
|
\item Intensywne wykrywanie kolizji
|
|
\item Skalowalność obciążenia
|
|
\item Prosta koncepcja $\rightarrow$ fokus na wydajność
|
|
\end{itemize}
|
|
\end{column}
|
|
\begin{column}{0.45\textwidth}
|
|
\includegraphics[width=\textwidth]{touhou.jpg}
|
|
{\tiny Touhou Project -- przykład bullet hell}
|
|
\end{column}
|
|
\end{columns}
|
|
\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:
|
|
\begin{enumerate}
|
|
\item \textbf{0--30s:} Niska trudność (podstawowi przeciwnicy)
|
|
\item \textbf{30--60s:} Średnia (szybsze jednostki, wieżyczki)
|
|
\item \textbf{60--90s:} Wysoka (wszystkie typy, max spawnu)
|
|
\end{enumerate}
|
|
\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
|
|
\small
|
|
\begin{tabular}{ll}
|
|
\toprule
|
|
\textbf{Komponent} & \textbf{Specyfikacja} \\
|
|
\midrule
|
|
CPU & AMD Ryzen 9 7900X3D (24 rdzenie) \\
|
|
GPU & NVIDIA GeForce 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{columns}
|
|
\begin{column}{0.5\textwidth}
|
|
\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{column}
|
|
\begin{column}{0.5\textwidth}
|
|
\includegraphics[width=\textwidth]{unity_game.png}
|
|
\end{column}
|
|
\end{columns}
|
|
\end{frame}
|
|
|
|
\begin{frame}
|
|
\frametitle{Implementacja -- Unreal Engine}
|
|
\begin{columns}
|
|
\begin{column}{0.5\textwidth}
|
|
\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{column}
|
|
\begin{column}{0.5\textwidth}
|
|
\includegraphics[width=\textwidth]{unreal_game_view.png}
|
|
\end{column}
|
|
\end{columns}
|
|
\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}
|
|
\vspace{0.3cm}
|
|
\centering
|
|
Implementacja w~Unity zajęła \textbf{$\sim$60\%} czasu potrzebnego w~Unreal Engine
|
|
\end{frame}
|
|
|
|
%==============================================================================
|
|
% SECTION 4: PROFILING TOOL
|
|
%==============================================================================
|
|
\section{Narzędzie profilowania}
|
|
|
|
\begin{frame}
|
|
\frametitle{Dlaczego NVIDIA Nsight Systems?}
|
|
\begin{itemize}
|
|
\item Wbudowane profilery silników są \textbf{nieporównywalne}:
|
|
\begin{itemize}
|
|
\item Różna definicja metryk
|
|
\item Różny narzut profilowania
|
|
\item Różne formaty wyjściowe
|
|
\end{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
|
|
\small
|
|
\begin{tabular}{lr}
|
|
\toprule
|
|
\textbf{Metryka} & \textbf{Wartość} \\
|
|
\midrule
|
|
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 przedziale 5--10 ms & \textbf{98,24\%} \\
|
|
\bottomrule
|
|
\end{tabular}
|
|
\end{table}
|
|
\vspace{0.3cm}
|
|
\centering
|
|
Wysoka stabilność -- IQR zaledwie 0,08 ms
|
|
\end{frame}
|
|
|
|
\begin{frame}
|
|
\frametitle{Unity -- architektura renderowania}
|
|
\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}
|
|
\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
|
|
FPS (niskie obciążenie) & 164 (V-Sync) & 332--339 \\
|
|
FPS (wymagająca scena) & 132 (1\% low) & 162 (faza 3) \\
|
|
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 wyników}
|
|
\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}
|
|
\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}
|
|
8 respondentów (1--10 lat doświadczenia):
|
|
\vspace{0.2cm}
|
|
\small
|
|
\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
|
|
\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}
|
|
|
|
Hipoteza \textbf{częściowo potwierdzona}:
|
|
\small
|
|
\begin{itemize}
|
|
\item[$\checkmark$] Prostsza architektura renderowania
|
|
\item[$\checkmark$] Stabilniejsze czasy klatek
|
|
\item[$\checkmark$] Łatwiejszy proces implementacji (60\% czasu)
|
|
\item[$\checkmark$] Natywne wsparcie 2D
|
|
\item[$\times$] Zbliżona wydajność w~wymagających scenach (132 vs 162 FPS)
|
|
\item[$\times$] Unity ograniczone przez V-Sync
|
|
\end{itemize}
|
|
\end{frame}
|
|
|
|
\begin{frame}
|
|
\frametitle{Rekomendacje}
|
|
\begin{table}
|
|
\centering
|
|
\small
|
|
\begin{tabular}{lll}
|
|
\toprule
|
|
\textbf{Typ projektu} & \textbf{Silnik} & \textbf{Uzasadnienie} \\
|
|
\midrule
|
|
Gra 2D indie & Unity & Natywne wsparcie 2D \\
|
|
Gra mobilna & Unity & Optymalizacja, rozmiar \\
|
|
Prototyp & Unity & Szybki cykl iteracji \\
|
|
Gra 3D AAA & Unreal & Nanite, Lumen \\
|
|
Gra VR high-end & Unreal & Zaawansowane 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 i~dalsze badania}
|
|
\small
|
|
\textbf{Ograniczenia:}
|
|
\begin{itemize}
|
|
\item Jeden gatunek gry (bullet hell)
|
|
\item Pojedyncza konfiguracja sprzętowa (high-end)
|
|
\item 8 wywiadów (badanie eksploracyjne)
|
|
\end{itemize}
|
|
\vspace{0.2cm}
|
|
\textbf{Propozycje dalszych badań:}
|
|
\begin{itemize}
|
|
\item Testy dla RPG, RTS, puzzle
|
|
\item Różne platformy (mobile, konsole, low-end PC)
|
|
\item Automatyczny framework benchmarkowy
|
|
\item Badanie longitudinalne (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} |