add state of the art

This commit is contained in:
2022-06-03 16:26:48 -04:00
parent 88c25fcff6
commit 84c1fa1595
26 changed files with 364 additions and 296 deletions

View File

@@ -0,0 +1,9 @@
\subsection{Desarrollo de Videojuegos}
\input{sections/marco_teorico/desarrollo_videojuegos/motor}
\input{sections/marco_teorico/desarrollo_videojuegos/game_ia}
\input{sections/marco_teorico/desarrollo_videojuegos/llvm}
\input{sections/marco_teorico/desarrollo_videojuegos/maquina_estado}

View File

@@ -0,0 +1,18 @@
\subsubsection{Game I.A.}
Para la toma de decisiones de la Inteligencia Artificial, se va a utilizar un lenguaje propio inspirado en Prolog. El Prolog es un lenguaje declarativo y lógico. \cite{Logic-Programming}
\begin{figure}[H]
\centering
\includegraphics[width=0.9\textwidth, height=0.9\textheight, keepaspectratio]{figures/Programacion logica vs funcional.png}
\caption{Programación Lógica vs. Funcional}
\label{fig:prolog_logic_functional}
\end{figure}
Cuando se trata de programación funcional, la idea principal es ver cómo se puede resolver un problema. Eso se hace de forma de paso por paso para resolver el problema. En programación lógico se usa un base de conocimiento para hacer preguntas y recibir respuestas que se utilizaran para resolver el problema. \cite{Prolog-Tutorial}
El lenguaje tipo Prolog debe tener 3 elementos importantes para funcionar.
\begin{enumerate}
\item \textbf{Hechos:} Son datos verdaderos. Por ejemplo ''el español es una idioma''.
\item \textbf{Reglas:} Son cláusulas condicionales que conectan los hechos. Por ejemplo ''si vives en Chile hablas el español''.
\item \textbf{Preguntas:} Son necesarias para tener una respuesta de la base de conocimiento. Por ejemplo ''¿El español es una idioma?''.
\end{enumerate}

View File

@@ -0,0 +1,14 @@
\subsubsubsection{Lenguaje de Programación Compilado}
El proyecto LLVM es un conjunto de tecnologías de compilador y toolchain, lo cual permite crear un lenguaje propio de programación. \cite{LLVM-Cookbook}
\begin{figure}[H]
\centering
\includegraphics[width=0.3\textwidth, height=0.3\textheight, keepaspectratio]{figures/llvm.png}
\caption{LLVM}
\label{fig:llvm}
\end{figure}
El LLVM consiste de varios sub-proyectos, pero el que será utilizado principalmente es LLVM Core.
Este sub-proyecto contiene un optimizador y generador de código, siendo este último llamado LLVM Intermediate Representation(LLVM IR). La funcionalidad es similar a una Virtual Machine de bytecode que es portátil y se puede correr en cualquier sistema que posee el LLVM.
Otro aspecto importante de LLVM es que se puede utilizar el LLVM IR que fue generado para después compilarlo a lenguaje máquina para la arquitectura computacional que se desee. Luego, el código objeto generado se puede utilizar con un linker para crear librerías y binarios, lo que tendrá importancia al querer integrar el código que compila nuestra compilador en el motor Godot.

View File

@@ -0,0 +1,13 @@
\subsubsubsection{Máquinas de Estados}
Una máquina de estados se utiliza para controlar el estado de un objeto que tiene una ramificación compleja y estados mutables. \cite{Game-Programming-Patterns} La máquina de estados finita es parte de una rama de la ciencia de la computación llamado \textit{''teoría de autómata''}, la cual incluye la famosa máquina de Turing. La máquina de estados es usualmente usada en programación de I.A., videojuegos y en la creación de compiladores de código, sin embargo fuera de estas 3 áreas, posee muy poca adopción y uso.
\begin{figure}[H]
\centering
\includegraphics[width=0.5\textwidth, height=0.5\textheight, keepaspectratio]{figures/state_machine.png}
\caption{Máquina de Estado Finito}
\label{fig:state_machine}
\end{figure}
La máquina de estado finita posee un conjunto concreto de estados en la que es capaz de estar, como ''saltar'' o ''caminar'', la cual también posee una restricción importante que consiste en que esta máquina solo puede presentar un solo estado en un instante de tiempo, es decir, el jugador no es capaz de saltar y caminar en un mismo momento.
El funcionamiento de la máquina de estados finita consiste en una secuencia de entradas y eventos que son enviadas a esta, los cuales se usan para cambiar entre estados. Cada máquina tiene un conjunto de transiciones y cada una de ellas está asociada con una entrada o un evento, lo que finalmente apunta a otro estado. Por tanto, cuando llega la entrada o evento y este coincide con una transición dentro del estado actual, la máquina cambiará al estado al que apunta la transición, por lo que si un jugador se encuentra ubicado en el estado ''caminar'', se puede presionar el botón de saltar para cambiar al estado de ''saltar''.

View File

@@ -0,0 +1,34 @@
\subsubsection{Motor de videojuego}
El motor de videojuego tiene una alta importancia en el desarrollo de videojuegos, ya que es responsable de proveer facilidad en utilizar gráficos, sonidos, física, redes y varios otros aspectos que ayudan en el desarrollo de un videojuego.
El motor que se utilizará se llama Godot. \cite{Desarrollo-de-Videojuegos,Game-Mechanics,Godot-Projects}
\begin{figure}[H]
\centering
\includegraphics[width=0.2\textwidth, height=0.2\textheight, keepaspectratio]{figures/godot.png}
\caption{Godot Engine}
\label{fig:godot_engine}
\end{figure}
El motor Godot tiene gran valor en el desarrollo del proyecto, principalmente por su capacidad para implementar arte de píxel, en comparación con motores similares como Unity o Unreal porque en Godot las distancias entre los elementos es medido en píxeles mientras que los otros motores utilizan metros, lo que facilita en gran medida la eficacia al trabajar en juegos 2D, que usualmente para este género de videojuegos se usan píxeles y no metros.
Otro factor importante es que Godot posee un elemento llamado GDNative. GDNative es una API que permite usar lenguajes de programación como C, C++ o Rust que son lenguajes que compilan el código a lenguaje máquina. \cite{Godot-24-Hours}
Tiene especial importancia para el proyecto ya que permite implementar otro lenguaje de programación que hará interacción con GDNative. Por otro lado también permite que la Inteligencia Artificial tome decisiones con mayor rapidez dado que el código objeto de máquina se ejecuta más velozmente que un lenguaje interpretado o que se compila a bytecode como se puede notar en los siguientes gráficos que compara GDScript(lenguaje interpretado similar a Python), C\# y C++.
\begin{figure}[H]
\centering
\includegraphics[width=0.9\textwidth, height=0.9\textheight, keepaspectratio]{figures/godot-gdnative.png}
\caption{Voxel Data Generation} \cite{GDNative-Benchmarks}
\label{fig:godot_gdnative_comparison}
\end{figure}
En el caso de generación de datos voxel, hay un aumento de 8846.43\% en su rendimiento comparando GDNative con GDScript y un aumento de 651.07\% comparando GDNative con C\#.
\begin{figure}[H]
\centering
\includegraphics[width=0.9\textwidth, height=0.9\textheight, keepaspectratio]{figures/godot-gdnative2.png}
\caption{Mesh Generation} \cite{GDNative-Benchmarks}
\label{fig:godot_gdnative_comparison2}
\end{figure}
En la prueba de generación de mallas el GDNative tiene un aumento de 651.07\% en su rendimiento comparando con C\#.