fix: most hbox issues

This commit is contained in:
Krzysztof kuhy Rudnicki 2026-01-26 18:40:30 +01:00
parent 066ab6e805
commit 01940e6ae1
9 changed files with 82 additions and 51 deletions

Binary file not shown.

View File

@ -62,9 +62,31 @@
%------------------------------------- %-------------------------------------
\cleardoublepage % Zaczynamy od nieparzystej strony \cleardoublepage % Zaczynamy od nieparzystej strony
\abstract \abstract
Przez ostatnią dekadę rynek tworzenia gier komputerowych zdominowały dwa silniki: Unity oraz Unreal Engine. Niniejsza praca podejmuje się wyzwania przeprowadzenia analizy porównawczej obu tych silników pod kątem wydajności oraz procesu programowania gier. W~tym celu wykorzystano narzędzie do profilowania NVIDIA Nsight, służące do oceny wydajności aplikacji graficznych, w~szczególności do pomiaru czasu klatki, obciążenia GPU oraz efektywności renderowania. Przeprowadzono również wywiady środowiskowe z~osobami związanymi profesjonalnie z~tworzeniem gier na obu platformach, jak również opisano proces twórczy, napotkane trudności oraz przewagi każdego z~silników. Na potrzeby pracy stworzono dwie gry w~tym samym gatunku --- \emph{bullet hell} --- słynącym z~mnogości elementów na ekranie i~efektów specjalnych, a~jednocześnie będącym relatywnie łatwym do zaimplementowania. Jedna gra została stworzona w~języku C\# (Unity), druga w~C++ (Unreal Engine). Następnie obie gry zostały poddane analizie w~programie NVIDIA Nsight w~celu oceny możliwości optymalizacji obu silników. Na podstawie wywiadów oraz analizy procesu twórczego scharakteryzowano również inne aspekty obu silników, takie jak próg wejścia, współpraca z~systemami kontroli wersji oraz architektura silnika. Praca stara się wypełnić niszę w~literaturze i~badaniach związanych z~oceną obu silników do gier. Przez ostatnią dekadę rynek tworzenia gier \\
komputerowych zdominowały dwa silniki: Unity oraz
Unreal Engine. \\ Niniejsza praca podejmuje się wyzwania przeprowadzenia analizy \\
porównawczej
obu tych silników pod kątem wyd ajności oraz procesu \\
programowania gier. W~tym celu wykorzystano
narzędzie do \\
profilowania NVIDIA Nsight, służące do oceny wydajności aplikacji \\ graficznych,
w~szczególności do pomiaru czasu klatki, obciążenia GPU oraz
efektywności renderowania.
Przeprowadzono również wywiady \\ środowiskowe z~osobami związanymi profesjonalnie z~tworzeniem
gier na obu platformach, jak również opisano proces twórczy, napotkane \\ trudności oraz przewagi
każdego z~silników. Na potrzeby pracy stworzono dwie gry w~tym samym gatunku ---
\emph{bullet hell} --- słynącym z \\ mnogości elementów na ekranie i~efektów specjalnych,
a~jednocześnie będącym relatywnie łatwym do zaimplementowania. Jedna gra została stworzona
w~języku C\# (Unity), druga w~C++ (Unreal Engine). \\ Następnie obie gry zostały poddane analizie
w~programie NVIDIA Nsight w~celu oceny możliwości optymalizacji obu silników. Na podstawie
wywiadów oraz analizy procesu twórczego scharakteryzowano również inne aspekty obu silników,
takie jak próg wejścia, współpraca z \\ systemami kontroli wersji oraz architektura silnika.
Praca stara się wypełnić niszę w~literaturze i~badaniach związanych z~oceną obu silników do gier.
\keywords Gry, Silniki do gier, C\#, C++, Unreal Engine, Unity, Gry \emph{bullet hell}, NVIDIA Nsight, Wydajność, Wywiady, Analiza porównawcza, Profilowanie, Renderowanie, Optymalizacja, Programowanie gier, Tworzenie gier, Czas klatki, Architektura silnika, Kontrola wersji, GPU \keywords Gry, Silniki do gier, C\#, C++, Unreal Engine, Unity, Gry \emph{bullet hell},
NVIDIA Nsight, Wydajność, Wywiady, Analiza porównawcza, Profilowanie, Renderowanie,
Optymalizacja, Programowanie gier, \\ Tworzenie gier, Czas klatki, Architektura silnika,
Kontrola wersji, GPU
%---------------------------------------- %----------------------------------------
% Streszczenie po angielsku dla \langpol % Streszczenie po angielsku dla \langpol
@ -97,7 +119,7 @@ Over the past decade, the video game development market has been dominated by tw
\input{tex/wywiady-analiza} \input{tex/wywiady-analiza}
\input{tex/implementacja-gry} % Analiza wywiadów z deweloperami gier \input{tex/implementacja-gry} % Analiza wywiadów z deweloperami gier
\input{tex/narzedzia-profilowania} % Narzędzia profilowania wydajności \input{tex/narzedzia-profilowania} % Narzędzia profilowania wydajności
% \input{tex/5-testy-wydajnosci} % Testy wydajności %\input{tex/5-testy-wydajnosci} % Testy wydajności
% \input{tex/6-analiza-mozliwosci} % Analiza możliwości i funkcjonalności % \input{tex/6-analiza-mozliwosci} % Analiza możliwości i funkcjonalności
% \input{tex/7-porownanie-wynikow} % Porównanie wyników i analiza % \input{tex/7-porownanie-wynikow} % Porównanie wyników i analiza
% \input{tex/8-podsumowanie} % \input{tex/8-podsumowanie}

View File

@ -64,7 +64,9 @@ Gatunek bullet hell został wybrany jako podstawa testów wydajnościowych z~nas
\begin{enumerate} \begin{enumerate}
\item \textbf{Intensywne wykorzystanie zasobów} -- jednoczesne renderowanie setek lub tysięcy obiektów (pocisków) stanowi znaczące obciążenie dla systemu renderowania \item \textbf{Intensywne wykorzystanie zasobów} -- jednoczesne renderowanie setek lub tysięcy obiektów (pocisków) stanowi znaczące obciążenie dla systemu renderowania
\item \textbf{Testowanie zarządzania pamięcią} -- ciągłe tworzenie i~niszczenie obiektów pocisków eksponuje różnice w~implementacji garbage collectora (Unity/C\#) versus ręcznego zarządzania pamięcią (Unreal/C++) \item \textbf{Testowanie zarządzania pamięcią} -- ciągłe tworzenie i~niszczenie obiektów
pocisków eksponuje różnice w~implementacji \\ garbage collectora (Unity/C\#) versus ręcznego
zarządzania pamięcią (Unreal/C++)
\item \textbf{Wymagania systemu fizyki} -- wykrywanie kolizji między graczem a~setkami pocisków w~każdej klatce obciąża system fizyki \item \textbf{Wymagania systemu fizyki} -- wykrywanie kolizji między graczem a~setkami pocisków w~każdej klatce obciąża system fizyki
@ -109,13 +111,9 @@ Praca składa się z~następujących rozdziałów:
\subsection{Metodologia} \subsection{Metodologia}
W~pracy zastosowano metodologię badawczą łączącą podejście ilościowe z~jakościowym:
\begin{itemize} \begin{itemize}
\item \textbf{Testy wydajnościowe} -- obiektywne pomiary z~wykorzystaniem NVIDIA Nsight Graphics, zapewniające porównywalność wyników między silnikami \item \textbf{Testy wydajnościowe} -- Pomiary z~wykorzystaniem NVIDIA Nsight Graphics, zapewniające porównywalność wyników między silnikami
\item \textbf{Wywiady z~deweloperami} -- badania jakościowe dostarczające kontekstu praktycznego użytkowania silników \item \textbf{Wywiady z~deweloperami} -- badania jakościowe dostarczające kontekstu praktycznego użytkowania silników
\item \textbf{Implementacja porównawcza} -- stworzenie identycznej gry w~obu silnikach, dokumentując różnice w~procesie deweloperskim \item \textbf{Implementacja porównawcza} -- stworzenie identycznej gry w~obu silnikach, dokumentując różnice w~procesie deweloperskim
\item \textbf{Analiza dokumentacji} -- przegląd oficjalnej dokumentacji i~materiałów edukacyjnych
\end{itemize} \end{itemize}
Takie wieloaspektowe podejście pozwala na kompleksową ocenę silników, uwzględniającą zarówno mierzalne parametry techniczne, jak i~subiektywne doświadczenia użytkowników.

View File

@ -42,7 +42,7 @@ Gregory \cite{gregory2018game} przedstawia taksonomię architektur silników gie
\begin{itemize} \begin{itemize}
\item \textbf{Silniki obiektowe} - bazujące na hierarchii obiektów gry z dziedziczeniem \item \textbf{Silniki obiektowe} - bazujące na hierarchii obiektów gry z dziedziczeniem
\item \textbf{Silniki komponentowe} - wykorzystujące systemy entity-component-system (ECS) \item \textbf{Silniki komponentowe} - wykorzystujące systemy \\ entity-component-system (ECS)
\item \textbf{Silniki hybrydowe} - łączące elementy różnych podejść architektonicznych \item \textbf{Silniki hybrydowe} - łączące elementy różnych podejść architektonicznych
\end{itemize} \end{itemize}
@ -83,8 +83,8 @@ Barczak i Woźniak \cite{barczak2019comparative} przeprowadzili kompleksowe stud
\subsection{Motywacja i cel pracy} \subsection{Motywacja i cel pracy}
Przegląd literatury pokazuje, że istnieje wiele badań porównawczych Przegląd literatury pokazuje, że istnieje wiele badań porównawczych
silników gier, jednak większość z nich koncentruje się na wybranych silników gier, jednak większość z nich koncentruje się na wybranych \\
aspektach, takich jak wydajność renderowania, łatwość użycia czy aspektach, takich jak wydajność renderowania, łatwość użycia czy \\
wsparcie dla konkretnych platform. Niniejsza praca wpisuje się w ten wsparcie dla konkretnych platform. Niniejsza praca wpisuje się w ten
nurt, przeprowadzając praktyczne porównanie silników Unity i Unreal nurt, przeprowadzając praktyczne porównanie silników Unity i Unreal
Engine pod kątem wydajności w wybranych scenariuszach testowych. Engine pod kątem wydajności w wybranych scenariuszach testowych.

View File

@ -14,7 +14,7 @@ kilkoma kluczowymi czynnikami:
\begin{itemize} \begin{itemize}
\item \textbf{Dominacja rynkowa} -- według raportu Video Game Insights, \item \textbf{Dominacja rynkowa} -- według raportu Video Game Insights,
w~2024 roku 51\% gier wydanych na platformie Steam powstało w~Unity, w~2024 roku 51\% gier wydanych na platformie Steam powstało w~Unity,
a~28\% w~Unreal Engine \cite{vgi2025engines} \\ a 28\% w~Unreal Engine \cite{vgi2025engines}
\item \textbf{Reprezentatywność podejść architektonicznych} -- \item \textbf{Reprezentatywność podejść architektonicznych} --
silniki reprezentują odmienne filozofie: Unity opiera się na silniki reprezentują odmienne filozofie: Unity opiera się na
języku C\# z~garbage collectorem, języku C\# z~garbage collectorem,
@ -59,9 +59,9 @@ platformie .NET/Mono, co zapewnia:
\end{itemize} \end{itemize}
Architektura Unity opiera się na wzorcu \textit{GameObject-Component}, Architektura Unity opiera się na wzorcu \textit{GameObject-Component},
gdzie każdy obiekt w scenie (GameObject) może posiadać dowolną \\ gdzie każdy obiekt w scenie (GameObject) może posiadać dowolną
liczbę komponentów definiujących jego zachowanie. liczbę \\ komponentów definiujących jego zachowanie.
Podejście to promuje kompozycję nad dziedziczeniem i ułatwia Podejście to promuje \\ kompozycję nad dziedziczeniem i ułatwia
tworzenie modularnego kodu. tworzenie modularnego kodu.
\subsubsection{Możliwości i funkcjonalności} \subsubsection{Możliwości i funkcjonalności}
@ -90,7 +90,7 @@ funkcjonalnościami \cite{unity_wikipedia}:
\begin{itemize} \begin{itemize}
\item Hierarchiczny widok sceny z możliwością edycji w czasie \item Hierarchiczny widok sceny z możliwością edycji w czasie
rzeczywistym rzeczywistym
\item Inspektor właściwości z obsługą serializacji pól poprzez \item Inspektor właściwości z obsługą serializacji pól \\ poprzez
atrybut \texttt{[SerializeField]} atrybut \texttt{[SerializeField]}
\item Wbudowany profiler wydajności (CPU, GPU, pamięć) \item Wbudowany profiler wydajności (CPU, GPU, pamięć)
\cite{unity_profiler} \cite{unity_profiler}
@ -162,19 +162,20 @@ Unreal Editor oferuje rozbudowane środowisko deweloperskie~\cite{unreal_docs}:
\centering \centering
\caption{Porównanie kluczowych cech Unity i Unreal Engine} \caption{Porównanie kluczowych cech Unity i Unreal Engine}
\label{tab:unity-vs-unreal} \label{tab:unity-vs-unreal}
\begin{tabular}{|l|c|c|} \small
\begin{tabular}{|l|l|l|}
\hline \hline
\textbf{Cecha} & \textbf{Unity} & \textbf{Unreal Engine} \\ \textbf{Cecha} & \textbf{Unity} & \textbf{Unreal} \\
\hline \hline
Język programowania & C\# & C++ / Blueprints \\ Język & C\# & C++ \\
\hline \hline
Zarządzanie pamięcią & Automatyczne (GC) & Ręczne / Smart pointers \\ Pamięć & Automatyczne (GC) & Ręczne (smart pointers) \\
\hline \hline
Architektura & GameObject-Component & Actor-Component \\ Architektura & GameObject Component & Actor Component \\
\hline \hline
Natywne wsparcie 2D & Tak & Nie (symulowane) \\ 2D & Natywne & Ograniczone \\
\hline \hline
Kod źródłowy & Częściowo dostępny & Pełny dostęp \\ Kod źródłowy & Częściowy & Pełny \\
\hline \hline
Główne zastosowania & Mobile, indie, 2D & AAA, FPS, 3D \\ Główne zastosowania & Mobile, indie, 2D & AAA, FPS, 3D \\
\hline \hline

View File

@ -19,7 +19,7 @@ za pomocą narzędzia NVIDIA Nsight Systems:
\begin{itemize} \begin{itemize}
\item \textbf{Czas klatki} (ang. \emph{frame time}) -- czas potrzebny \item \textbf{Czas klatki} (ang. \emph{frame time}) -- czas potrzebny
na wyrenderowanie pojedynczej klatki, wyrażony w~milisekundach na wyrenderowanie pojedynczej klatki, wyrażony w~milisekundach
\item \textbf{Liczba klatek na sekundę} (FPS) -- wartość pochodna \item \textbf{Liczba klatek na sekundę} (FPS) -- wartość \\ pochodna
od czasu klatki, kluczowa dla płynności rozgrywki od czasu klatki, kluczowa dla płynności rozgrywki
\item \textbf{Wykorzystanie GPU} -- procentowe obciążenie karty graficznej, \item \textbf{Wykorzystanie GPU} -- procentowe obciążenie karty graficznej,
mierzone poprzez liczniki sprzętowe NVIDIA mierzone poprzez liczniki sprzętowe NVIDIA
@ -89,8 +89,8 @@ progresywnie zwiększała obciążenie poprzez:
\begin{itemize} \begin{itemize}
\item \textbf{Przyspieszanie spawnu przeciwników} -- interwał między \item \textbf{Przyspieszanie spawnu przeciwników} -- interwał między
spawnem zmniejsza się liniowo od 0,25~s (początek) do 0,08~s (koniec), \\ spawnem zmniejsza się liniowo od 0,25~s (początek) \\ do 0,08~s (koniec),
z~dodatkowym ,,finalnym szturmem'' przez ostatnie 5~sekund z~dodatkowym ,,finalnym szturmem'' przez \\ ostatnie 5~sekund
\item \textbf{Zwiększanie różnorodności typów przeciwników} -- początkowo \item \textbf{Zwiększanie różnorodności typów przeciwników} -- początkowo
(0--25\% czasu) pojawiają się tylko podstawowi przeciwnicy, później (0--25\% czasu) pojawiają się tylko podstawowi przeciwnicy, później
wprowadzane są kolejno szybsze jednostki (25--50\%), strzelające wieżyczki wprowadzane są kolejno szybsze jednostki (25--50\%), strzelające wieżyczki

View File

@ -3,8 +3,6 @@
\subsection{Implementacja w Unity} \subsection{Implementacja w Unity}
\label{subsec:impl-unity} \label{subsec:impl-unity}
\subsubsection{Środowisko i konfiguracja projektu}
Projekt Unity został utworzony w~wersji LTS z~wykorzystaniem standardowego renderera 2D. Instalacja Projekt Unity został utworzony w~wersji LTS z~wykorzystaniem standardowego renderera 2D. Instalacja
silnika na systemie Linux przebiegła bezproblemowo dzięki Unity Hub silnika na systemie Linux przebiegła bezproblemowo dzięki Unity Hub
\cite{unity_hub} \cite{unity_hub_download_arch}, który zapewnia spójne \cite{unity_hub} \cite{unity_hub_download_arch}, który zapewnia spójne
@ -12,14 +10,14 @@ zarządzanie wersjami edytora i~projektami.
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\includegraphics[width=1.0\textwidth]{tex/img/unity_hub_default_screen.png} \includegraphics[width=0.9\textwidth]{tex/img/unity_hub_default_screen.png}
\caption{Ekran powitalny Unity Hub.} \caption{Ekran powitalny Unity Hub.}
\label{fig:unity_hub_welcome} \label{fig:unity_hub_welcome}
\end{figure} \end{figure}
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\includegraphics[width=1.0\textwidth]{tex/img/unity_hub_editor_view.png} \includegraphics[width=0.9\textwidth]{tex/img/unity_hub_editor_view.png}
\caption{Widok edytora Unity.} \caption{Widok edytora Unity.}
\label{fig:unity_hub_editor_view} \label{fig:unity_hub_editor_view}
\end{figure} \end{figure}
@ -29,7 +27,9 @@ zarządzanie wersjami edytora i~projektami.
Implementacja Unity wykorzystuje kilka kluczowych wzorców projektowych: Implementacja Unity wykorzystuje kilka kluczowych wzorców projektowych:
\paragraph{Wzorzec Bootstrap} \paragraph{Wzorzec Bootstrap}
Klasa \texttt{GameBootstrap} wykorzystuje atrybut \texttt{[Runtime\-Initialize\-OnLoad\-Method]} do zapewnienia, że obiekt \texttt{GameInitializer} istnieje w~scenie przed rozpoczęciem gry. Jest to eleganckie rozwiązanie problemu inicjalizacji singletonów w~Unity. Klasa \texttt{GameBootstrap} wykorzystuje atrybut \\ \texttt{[Runtime\-Initialize\-OnLoad\-Method]}
do zapewnienia, że obiekt \\ \texttt{GameInitializer} istnieje w~scenie przed rozpoczęciem gry.
Jest to eleganckie rozwiązanie problemu inicjalizacji singletonów w~Unity.
\paragraph{Object Pooling} \paragraph{Object Pooling}
System \texttt{BulletPool} stanowi rdzeń optymalizacji wydajnościowej. Zamiast ciągłego tworzenia i niszczenia obiektów pocisków (co generowałoby znaczące obciążenie garbage collectora), pociski są recyklingowane z puli: System \texttt{BulletPool} stanowi rdzeń optymalizacji wydajnościowej. Zamiast ciągłego tworzenia i niszczenia obiektów pocisków (co generowałoby znaczące obciążenie garbage collectora), pociski są recyklingowane z puli:
@ -70,9 +70,9 @@ Przeciwnicy są definiowani przez strukturę \texttt{EnemyBlueprint}, która zaw
Podczas implementacji napotkano następujące wyzwania: Podczas implementacji napotkano następujące wyzwania:
\begin{enumerate} \begin{enumerate}
\item \textbf{Garbage Collection} -- początkowa implementacja bez object poolingu powodowała zauważalne spadki klatek przy dużej liczbie pocisków \item \textbf{Garbage Collection} -- początkowa implementacja bez \\ object poolingu powodowała zauważalne spadki klatek przy dużej liczbie pocisków
\item \textbf{Kolejność inicjalizacji} -- konieczność użycia wzorca Bootstrap wynikała z~nieprzewidywalnej kolejności wywoływania metod \texttt{Awake()} i~\texttt{Start()} \item \textbf{Kolejność inicjalizacji} -- konieczność użycia wzorca Bootstrap wynikała z~nieprzewidywalnej kolejności wywoływania metod \texttt{Awake()} i~\texttt{Start()}
\item \textbf{Serializacja} -- atrybuty \texttt{[SerializeField]} wymagały starannego rozplanowania, które pola powinny być edytowalne w~inspektorze \item \textbf{Serializacja} -- atrybuty \texttt{[SerializeField]} wymagały \\ starannego rozplanowania, które pola powinny być edytowalne w~inspektorze
\item Interfejs użytkownika nie jest odświeżany po otwarciu menu \cite{linux_editor_does_not_redraw} -- wymagało to ręcznego wymuszenia odświeżenia inspektora \item Interfejs użytkownika nie jest odświeżany po otwarciu menu \cite{linux_editor_does_not_redraw} -- wymagało to ręcznego wymuszenia odświeżenia inspektora
\end{enumerate} \end{enumerate}
@ -146,7 +146,7 @@ tradycyjny sposób
\subsubsection{Object Pooling w Unreal} \subsubsection{Object Pooling w Unreal}
Implementacja object poolingu w~Unreal wymaga innego podejścia niż w~Unity. Implementacja object poolingu w~Unreal wymaga innego podejścia \\ niż w Unity.
Zamiast prostego \texttt{SetActive(true/\allowbreak false)}, Unreal wykorzystuje: Zamiast prostego \texttt{SetActive(true/\allowbreak false)}, Unreal wykorzystuje:
\begin{itemize} \begin{itemize}
@ -164,7 +164,7 @@ Ta granularność daje większą kontrolę, ale wymaga więcej kodu do osiągni
\item \textbf{Czas kompilacji} -- kompilacja projektów C++ jest znacznie wolniejsza niż kompilacja C\# w Unity \item \textbf{Czas kompilacji} -- kompilacja projektów C++ jest znacznie wolniejsza niż kompilacja C\# w Unity
\item \textbf{Rozmiar projektu} -- nawet prosty projekt Unreal zajmuje wielokrotnie więcej miejsca na dysku \item \textbf{Rozmiar projektu} -- nawet prosty projekt Unreal zajmuje wielokrotnie więcej miejsca na dysku
\item \textbf{Dokumentacja} -- dla mniej popularnych zastosowań (jak gry 2D) dokumentacja jest ograniczona \item \textbf{Dokumentacja} -- dla mniej popularnych zastosowań (jak gry 2D) dokumentacja jest ograniczona
\item \textbf{Blueprinty i kontrola wersji} -- pliki Blueprintów są binarne, co utrudnia merge'owanie i code review \item \textbf{Blueprinty i kontrola wersji} -- pliki Blueprintów są binarne, co \\ utrudnia merge'owanie i code review
\end{enumerate} \end{enumerate}
\subsubsection{Pozytywne aspekty Unreal} \subsubsection{Pozytywne aspekty Unreal}
@ -204,7 +204,7 @@ Rozmiar projektu & Mały & Duży \\
\hline \hline
\end{tabular} \end{tabular}
\end{table} \end{table}
\newpage
\subsection{Wnioski z implementacji} \subsection{Wnioski z implementacji}
Doświadczenia z implementacji gry bullet-hell potwierdzają, że wybór silnika powinien być uzależniony od typu projektu: Doświadczenia z implementacji gry bullet-hell potwierdzają, że wybór silnika powinien być uzależniony od typu projektu:
@ -213,8 +213,10 @@ Doświadczenia z implementacji gry bullet-hell potwierdzają, że wybór silnika
\item \textbf{Dla gier 2D} -- Unity oferuje znacznie lepsze wsparcie natywne, niższy próg wejścia i szybszy cykl iteracji \item \textbf{Dla gier 2D} -- Unity oferuje znacznie lepsze wsparcie natywne, niższy próg wejścia i szybszy cykl iteracji
\item \textbf{Dla gier 3D AAA} -- Unreal Engine dysponuje lepszymi narzędziami do tworzenia fotorealistycznej grafiki \item \textbf{Dla gier 3D AAA} -- Unreal Engine dysponuje lepszymi narzędziami do tworzenia fotorealistycznej grafiki
\item \textbf{Dla prototypowania} -- Unity pozwala na szybsze testowanie koncepcji dzięki hot reloadowi i prostszej konfiguracji \item \textbf{Dla prototypowania} -- Unity pozwala na szybsze testowanie koncepcji dzięki hot reloadowi i prostszej konfiguracji
\item \textbf{Dla zespołów mieszanych} -- Blueprinty Unreal mogą być wartościowe dla współpracy z designerami, choć problemy z kontrolą wersji stanowią wyzwanie \item \textbf{Dla zespołów mieszanych} -- Blueprinty Unreal mogą być \\ wartościowe dla współpracy
z designerami, choć problemy \\ z kontrolą wersji stanowią wyzwanie
\end{enumerate} \end{enumerate}
Implementacja gry bullet-hell w~Unity zajęła około 60\% czasu potrzebnego na implementację analogicznej funkcjonalności Implementacja gry bullet-hell w~Unity zajęła około 60\% czasu potrzebnego na implementację
w~Unreal Engine, głównie ze względu na natywne wsparcie 2D i~prostszy system object poolingu. analogicznej funkcjonalności
w Unreal Engine, głównie ze względu na natywne wsparcie 2D i prostszy system object poolingu.

View File

@ -14,7 +14,7 @@ Zarówno Unity, jak i~Unreal Engine oferują własne, wbudowane narzędzia do an
Unity dostarcza rozbudowany profiler dostępny bezpośrednio w~edytorze (Window $\rightarrow$ Analysis $\rightarrow$ Profiler)~\cite{unity_profiler}. Narzędzie to oferuje: Unity dostarcza rozbudowany profiler dostępny bezpośrednio w~edytorze (Window $\rightarrow$ Analysis $\rightarrow$ Profiler)~\cite{unity_profiler}. Narzędzie to oferuje:
\begin{itemize} \begin{itemize}
\item \textbf{CPU Profiler} -- analiza czasu wykonania poszczególnych funkcji, z~podziałem na kategorie (rendering, skrypty, fizyka, animacje) \item \textbf{CPU Profiler} -- analiza czasu wykonania poszczególnych funkcji, z podziałem na kategorie (rendering, skrypty, fizyka, animacje)
\item \textbf{GPU Profiler} -- pomiar czasu renderowania na karcie graficznej \item \textbf{GPU Profiler} -- pomiar czasu renderowania na karcie graficznej
\item \textbf{Memory Profiler} -- szczegółowa analiza alokacji pamięci, wykrywanie wycieków \item \textbf{Memory Profiler} -- szczegółowa analiza alokacji pamięci, wykrywanie wycieków
\item \textbf{Audio Profiler} -- monitorowanie obciążenia systemu dźwiękowego \item \textbf{Audio Profiler} -- monitorowanie obciążenia systemu dźwiękowego
@ -26,7 +26,7 @@ Unity Profiler umożliwia również zdalne profilowanie aplikacji uruchomionej n
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\includegraphics[width=1.0\textwidth]{tex/img/unity_profiler.png} \includegraphics[width=0.9\textwidth]{tex/img/unity_profiler.png}
\caption{Interfejs Unity Profiler z~widokiem analizy wydajności CPU i~GPU.} \caption{Interfejs Unity Profiler z~widokiem analizy wydajności CPU i~GPU.}
\label{fig:unity-profiler} \label{fig:unity-profiler}
\end{figure} \end{figure}
@ -47,7 +47,7 @@ Dodatkowo Unreal Engine udostępnia komendy konsolowe (np.~\texttt{stat fps}, \t
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\includegraphics[width=1.0\textwidth]{tex/img/unreal_profiler.png} \includegraphics[width=0.9\textwidth]{tex/img/unreal_profiler.png}
\caption{Interfejs Unreal Insights z~widokiem analizy wydajności.} \caption{Interfejs Unreal Insights z~widokiem analizy wydajności.}
\label{fig:unreal-profiler} \label{fig:unreal-profiler}
\end{figure} \end{figure}
@ -58,7 +58,7 @@ Pomimo rozbudowanych możliwości, wbudowane profilery silników posiadają isto
\begin{enumerate} \begin{enumerate}
\item \textbf{Brak standaryzacji metryk} -- każdy silnik definiuje i~mierzy parametry w~odmienny sposób, co utrudnia bezpośrednie porównania \item \textbf{Brak standaryzacji metryk} -- każdy silnik definiuje i~mierzy parametry w~odmienny sposób, co utrudnia bezpośrednie porównania
\item \textbf{Różna granularność danych} -- poziom szczegółowości raportów różni się między silnikami \item \textbf{Różna granularność danych} -- poziom szczegółowości raportów \\ różni się między silnikami
\item \textbf{Narzut profilowania} -- wbudowane profilery same generują obciążenie, które może być różne dla każdego silnika \item \textbf{Narzut profilowania} -- wbudowane profilery same generują obciążenie, które może być różne dla każdego silnika
\item \textbf{Nieporównywalność formatów wyjściowych} -- dane eksportowane przez różne profilery mają odmienne struktury \item \textbf{Nieporównywalność formatów wyjściowych} -- dane eksportowane przez różne profilery mają odmienne struktury
\end{enumerate} \end{enumerate}
@ -74,7 +74,7 @@ niezależnie od używanego silnika czy API graficznego~\cite{nvidia_nsight}.
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\includegraphics[width=1.0\textwidth]{tex/img/nvidia_nsight.jpg} \includegraphics[width=0.9\textwidth]{tex/img/nvidia_nsight.jpg}
\caption{Interfejs NVIDIA Nsight Graphics z~widokiem analizy GPU.} \caption{Interfejs NVIDIA Nsight Graphics z~widokiem analizy GPU.}
\label{fig:nvidia-nsight} \label{fig:nvidia-nsight}
\end{figure} \end{figure}
@ -88,7 +88,7 @@ był następującymi czynnikami:
\item \textbf{Niezależność od silnika} -- Nsight analizuje aplikację na poziomie wywołań API graficznego (DirectX, Vulkan, OpenGL), co zapewnia porównywalność wyników między Unity a~Unreal Engine \item \textbf{Niezależność od silnika} -- Nsight analizuje aplikację na poziomie wywołań API graficznego (DirectX, Vulkan, OpenGL), co zapewnia porównywalność wyników między Unity a~Unreal Engine
\item \textbf{Standaryzowane metryki} -- narzędzie dostarcza zunifikowany zestaw metryk sprzętowych (GPU utilization, memory bandwidth, shader throughput) \item \textbf{Standaryzowane metryki} -- narzędzie dostarcza zunifikowany zestaw metryk sprzętowych (GPU utilization, memory bandwidth, shader throughput)
\item \textbf{Minimalny narzut} -- profilowanie na poziomie sterownika generuje mniejsze zakłócenia niż profilery działające wewnątrz silnika \item \textbf{Minimalny narzut} -- profilowanie na poziomie sterownika generuje mniejsze zakłócenia niż profilery działające wewnątrz silnika
\item \textbf{Dostęp do danych niskopoziomowych} -- możliwość analizy poszczególnych wywołań draw call, shaderów, transferów pamięci \item \textbf{Dostęp do danych niskopoziomowych} -- możliwość analizy \\ poszczególnych wywołań draw call, shaderów, transferów pamięci
\item \textbf{Spójny format danych} -- wyniki z~obu silników mają identyczną strukturę, co ułatwia automatyzację analizy \item \textbf{Spójny format danych} -- wyniki z~obu silników mają identyczną strukturę, co ułatwia automatyzację analizy
\end{itemize} \end{itemize}

View File

@ -81,7 +81,9 @@ Jednocześnie wskazywano na problemy wynikające z długu technologicznego Unity
\subsubsection{Struktura Unreal Engine} \subsubsection{Struktura Unreal Engine}
Architektura Unreal Engine wymusza bardziej uporządkowany styl pracy. Respondenci zauważali, że nawet podstawowe projekty tworzone w Unreal mają tendencję do bycia lepiej zorganizowanymi, ponieważ silnik narzuca określoną strukturę. Architektura Unreal Engine wymusza bardziej uporządkowany \\ styl pracy. Respondenci zauważali,
że nawet podstawowe projekty tworzone w Unreal mają tendencję do bycia lepiej zorganizowanymi,
ponieważ silnik narzuca określoną strukturę.
Struktura aktor-komponent w Unreal (level zawiera aktorów, aktorzy zawierają komponenty) została opisana jako bardziej restrykcyjna niż prefaby w Unity. Próby tworzenia zagnieżdżonych struktur (aktor w aktorze) często prowadzą do problemów, podczas gdy w Unity hierarchie prefabów są bardziej elastyczne. Struktura aktor-komponent w Unreal (level zawiera aktorów, aktorzy zawierają komponenty) została opisana jako bardziej restrykcyjna niż prefaby w Unity. Próby tworzenia zagnieżdżonych struktur (aktor w aktorze) często prowadzą do problemów, podczas gdy w Unity hierarchie prefabów są bardziej elastyczne.
@ -141,9 +143,13 @@ Unity wymaga więcej pracy przy tworzeniu narzędzi dla osób nietechnicznych. R
\subsubsection{Dostępność i jakość assetów} \subsubsection{Dostępność i jakość assetów}
Asset Store Unity był oceniany jako lepiej zarządzany i bogatszy. Respondenci wskazywali na silniejsze wsparcie społeczności i większe szanse na znalezienie potrzebnych zasobów. Asset Store Unity był oceniany jako lepiej zarządzany i bogatszy. \\
Respondenci wskazywali na silniejsze wsparcie społeczności i większe szanse na
znalezienie potrzebnych zasobów.
Interesującą obserwacją było to, że najlepsze produkty z Asset Store mają tendencję do opuszczania platformy -- twórcy zakładają własne strony internetowe po osiągnięciu określonego poziomu popularności. Interesującą obserwacją było to, że najlepsze produkty z Asset Store mają tendencję do
opuszczania platformy -- twórcy zakładają własne \\ strony internetowe po osiągnięciu określonego
poziomu popularności.
Unreal Marketplace przeszedł niedawno transformację w platformę Fab, co według respondentów pogorszyło doświadczenie użytkownika i zwiększyło liczbę kroków potrzebnych do pobrania darmowych zasobów. Unreal Marketplace przeszedł niedawno transformację w platformę Fab, co według respondentów pogorszyło doświadczenie użytkownika i zwiększyło liczbę kroków potrzebnych do pobrania darmowych zasobów.
@ -184,7 +190,9 @@ Problem garbage collectora w Unity był wielokrotnie wspominany jako znany probl
\subsubsection{Entity Component System (ECS)} \subsubsection{Entity Component System (ECS)}
Nowy system DOTS/ECS w Unity był oczekiwaną funkcjonalnością, która w momencie przeprowadzania wywiadów została już oficjalnie wydana. System ten pozwala na pisanie wysoce wydajnego, zorientowanego na dane kodu, kosztem większej złożoności programistycznej. Nowy system DOTS/ECS w Unity był oczekiwaną funkcjonalnością, \\ która w momencie przeprowadzania
wywiadów została już \\ oficjalnie wydana. System ten pozwala na pisanie wysoce wydajnego,
zorientowanego na dane kodu, kosztem większej złożoności programistycznej.
\subsubsection{UI Toolkit} \subsubsection{UI Toolkit}
@ -221,7 +229,7 @@ Na podstawie przeprowadzonych wywiadów można sformułować następujące wnios
\subsubsection{Silne strony Unreal Engine} \subsubsection{Silne strony Unreal Engine}
\begin{itemize} \begin{itemize}
\item Wymuszona struktura projektu promująca dobre praktyki \item Wymuszona struktura projektu promująca dobre praktyki
\item System Blueprints ułatwiający współpracę z osobami nietechnicznymi \item System Blueprints ułatwiający współpracę z osobami \\ nietechnicznymi
\item Więcej gotowych funkcjonalności ,,out of the box'' \item Więcej gotowych funkcjonalności ,,out of the box''
\item Lepsze wsparcie dla projektów wysokobudżetowych (grafika, multiplayer) \item Lepsze wsparcie dla projektów wysokobudżetowych (grafika, multiplayer)
\item Dostęp do kodu źródłowego silnika \item Dostęp do kodu źródłowego silnika