Introducción
En este artículo vamos a analizar la ejecución de un programa simple en Unity para entender cuáles son las diferencias entre Update y FixedUpdate en Unity.
Para ver estas diferencias monté una escena simple de Unity con dos cubos y algunos scripts de programación, te puedes descargar el paquete de Unity en este artículo.
Paquete de Unity para Descargar
A continuación puedes descargar un paquete de Unity que puedes importar en tu proyecto en Unity y ver cómo se comportan dos objetos a los que se les aplica una traslación en el método Update en un caso y en el método FixedUpdate en el otro.
En el siguiente vídeo explico cómo funciona un prototipo en Unity que permite estudiar las diferencias entre Update y FixedUpdate
Qué son los métodos Update y FixedUpdate
Para empezar, los métodos Update y FixedUpdate son funciones que pertenecen a la clase MonoBehaviour y que se ejecutarán de manera automática y cíclica cuando colocamos esos Scripts en la jerarquía.
Resumen de las diferencias entre Update y FixedUpdate en Unity
1. La cantidad de ejecuciones por segundo de Update es variable, mientras que la cantidad de ejecuciones por segundo de FixedUpdate es fija.
2. En general no se tiene control sobre las ejecuciones de Update, dependerán del rendimiento de cada ordendor. Para FixedUpdate podemos modificar el Time Step en Project Settings > Time, por defecto es 0.02 segundos (20 milisegundos).
3. Ambas funciones se utilizan para hacer cambios en el tiempo, de lo anterior se concluye que Update se utiliza para la parte lógica y FixedUpdate para la parte física, movimientos y animaciones, es decir acciones que deben cambiar de manera regular en el tiempo.
Cómo ver las diferencias entre Update y FixedUpdate usando el paquete para descargar
Al importar el paquete van a tener una carpeta que contiene todos los archivos necesarios, lo que deben hacer es abrir la escena que está dentro de la carpeta, llamada «UpdateFixedUpdate».
Dentro de la escena tenemos un contador de frames por segundo para saber la tasa de refresco del juego en todo momento.
Tenemos dos Cubos llamados Update y FixedUpdate, ambos tienen asignado un script llamado «UpdateFixedUpdate» en el que se define una velocidad para el movimiento de los cubos y una variable lógica que va a determinar si el movimiento del cubo se hace en la función Update o en la función FixedUpdate.
Luego hay otro GameObject llamado Saturation que tiene asignado un Script llamado «CreateObjectsForever», cuando este Script se active comenzará a instanciar cubos como hijos del Script Saturation de manera ininterrumpida, lo que ocasionará poco a poco ocasionará una sobrecarga de procesamiento y con un poco de análisis nos permitirá entender las diferencias entre Update y FixedUpdate en Unity.
Procedimiento para el Análisis
Primera Prueba sin Sobrecarga
Inicialmente nos aseguramos que el GameObject Saturation esté deshabilitado o su Script «CreateObjectsForever» esté deshabilitado, para que inicialmente no se produzca la saturación del juego.
Nos aseguramos que ambos objetos tengan la misma velocidad en su Script UpdateFixedUpdate y que en el objeto Update la casilla «Use Fixed Update» esté desmarcada, mientras que en el objeto FixedUpdate, esa casilla esté marcada.
Entramos en el modo juego y observamos cómo se comportan los cubos. En mi caso se observa que el cubo que se mueve utilizando el método Update lo hace de manera más rápida que el cubo que se mueve en el método FixedUpdate. El cubo que se mueve con Update lo hace a más del doble de velocidad y a veces se mueve más rápido y otras más lento, mientras que el otro cubo se mueve de manera regular en el tiempo.
Segunda Prueba con Sobrecarga
Ahora activamos el objeto Saturation (o su script), para activar la instanciación de los objetos.
Al entrar en el Modo Juego se observa que los FPS del juego comienzan a descender gradualmente. Este cambio puede ser aún más drástico si seleccionamos el objeto Saturation en la jerarquía y si lo estamos viendo de cerca en la pestaña Editor. Pero lo más importante que notamos es que la velocidad del cubo que se mueve con Update comienza a disminuir, mientras más es la sobrecarga, más lento se mueve el cubo, hasta que en un momento es superado por el cubo que se mueve con FixedUpdate.
Esto nos indica que a mayor saturación de procesamiento, la función Update se ejecuta menos veces por segundo, mientras que la función FixedUpdate se ejecuta de manera regular en el tiempo y, pese a que el juego comience a tener lag, los movimientos serán proporcionales.