BURST COMPILER
No hay demasiado que explicar que no hayamos hecho en la parte de arriba del post. Pero como habíamos dicho, es ALGO que nos va a hacer más fácil la compilación de algunas cosas (y su creación). Para utilizarlo, lo único que tenémos que hacer es agregar el atributo BurstCompile arriba de nuestro Job. Nos quedaría de la siguiente manera:
Y con esto nada más ya tenemos una optimización adicional a nuestro código. Obviamente la optimización la van a notar siempre dependiendo de varios factores como qué cosa sea lo que pongan a procesar en el Job.
Y obviamente, todavía hay más cosas que podemos hacer…
Combinando ECS, JobSystem y Burst Compiler
Obviamente podemos hacer todavía más optimizaciones a todo esto. Los casos separados que mostré arriba son para procesamientos bastante puntuales, pero si vamos a mover nuestras cajas hacia el centro, podemos hacer todo directamente en simultáneo. El creado de las cajas ya lo hicimos con ECS, lo único que cambiaríamos sería que ahora las creamos a todas las cajas de una.
Vamos a modificar el código para que al apretar la barra espaciadora cree 20000 cajas de una.
También vamos a dejar de agregarle el componente para destruir las cajas, puesto que querémos ver cómo se mueven. Así que nuestro método SpawnEntity() quedaría de la siguiente manera.
Agregué las variables min y max para que se entienda un poco más el cálculo hecho con el random. Por último vamos al sistema encargado del movimiento y hacemos unos cambios para que las cajas se muevan hacia el centro.
De más está decir que antes de probar esto deberíamos desactivar el GameObject que instancia de una todas nuestras cajas. Voy a dejar abajo unas capturas de los diferentes frame rates obtenidos con cada uno de los sistemas, todos creando y moviendo 30000 cajas.
Podemos incluso mejorar más esto, agregando Jobs a nuestro sistema, de la siguiente manera:
De esta manera agregamos Jobs al sistema de ECS. Peeeeeeero además podemos agregar Burst (que no estoy del todo seguro si en las últimas versiones ya viene agregado por default). Pero para agregarlo de manera directa y clara… Nos quedaría así el código:
Para más información de lo que hace el parámetro pasado a WithBurst pueden consultar en esta página. Y para mostrar los resultados finales, quedarían así:
Y con esto mostramos las diferencias de cada uno. Un poco retomando lo que les había dicho al principio respecto de separar las tareas, también viene a que, por ejemplo, si ahora activamos la parte donde agregamos el componente para eliminar las cajas, vamos a ver que si querémos usar Jobs y Burst para esta tarea, Unity no nos va a dejar. Esto es porque no podemos modificar la “lista de entidades” en paralelo.
Hagan, si quieren, más pruebas de estrés para ver los límites del sistema.