C++ Lambdas y callbacks variádicos: sistemas flexibles en GameEngine ECS

preview_player
Показать описание
==== Sesión 11 - 23/feb/2022 ====
Revisamos nuestro GameEngine Entity-Component-System (ECS) básico y diseñamos mejoras para manejar sistemas. Nos preguntamos sobre qué son los Lambdas, cómo funcionan y qué relación tienen con los punteros a función. Aprovechamos para diferenciar entre tipo/clase y objeto y vemos lo importante que son estos conceptos. Mejoramos nuestro bucle forall para que pueda aceptar lambdas genéricos. Aprendemos las diferencias entre pasar por valor, referencia constante y forwarding reference, en el caso de Lambdas genéricos.

Después implementamos el getComponent en nuestro Entity Manager, y vemos cómo reutilizar código para mejorar legibilidad y mantenibilidad. Analizamos lo importante de esta práctica y cómo hacerla con frecuencia.

Probamos el motor y nos encontramos con un segmentation fault por desreferenciar un null pointer. Vemos lo importante que es tener habilitado el address sanitizer y cómo localizar y corregir estos fallos rápidamente.

Nos planteamos como mejorar nuestro bucle de recorrido de todas las entidades, para que cada sistema sólo procese las entidades que le harán falta y no todas. Implementamos un método for each que recibe los componentes que maneja nuestro sistema para recorrer sólo las entidades que los tienen. Vemos cómo implementarlo con fold expressions.

Mejoramos nuestro for each utilizando listas de tipos (typelists) en lugar de tipos sueltos. Con eso podemos diseñar nuestros sistemas para que tengan una firma, hacerlos más legibles y manejables. Aprendemos también como extraer los template parameter packs a partir de los typelists que los contienen, de una forma fácil y rápida.

Finalmente, implementamos un callback variádico para recibir los componentes como parámetros, evitando llamadas individuales para extraerlos.

==== Contenidos ====
0:00:00 GameEngine ECS básico: Diagrama de de la implementación
0:01:50 ¿Cómo está implementado el GameEngine ECS? Revisión de código
0:05:30 Funciones Lambda en C++ ¿Qué son?
0:08:00 Diferencia entre Tipo/Clase y Objeto en C++
0:11:29 Punteros a función en C++: ¿Por qué son así?
0:14:35 ¿Qué son las capturas de un Lambda?
0:18:05 ¿Para qué necesito capturas en un Lambda?
0:21:05 Recibir objetos Lambda genéricos como parámetro
0:24:00 No podemos saber el tipo de un Lambda (auto)
0:25:25 Lambdas y paso por copia, referencia, const y forwarding references
0:33:18 Obtener Componentes en GameEngine ECS
0:39:23 Cómo reutilizar código y hacerlo más legible (mantenibilidad)
0:44:33 Métodos get const correct
0:48:46 Probando el GameEngine y el Sistema de Física
0:51:30 Detectando y corrigiendo un segmentation fault (null pointer)
0:57:19 Diseñar mejoras en GameEngine ECS: for each y componentes
1:01:40 fold expressions en C++: condicionales con tipos variádicos
1:15:40 Listas de tipos (typelists) para mejorar el GameEngine ECS
1:18:10 Cómo obtener parameter packs de typelists (listas de tipos)
1:28:10 Variadic Callbacks: cómo implementarlos

#GameDev #programming #Coding #CPP
====================
Clase de Videojuegos 1 2021/22
Grado en Ingeniería Multimedia
Universidad de Alicante
Рекомендации по теме
Комментарии
Автор

El ECS es el tipo de motor mas genial y gratificante de implementar. Alucino con cada vídeo.

davidsehnsucht
Автор

Gran maestro, sigue así, he aprendido mucho con tus videos y eso que solo los veo ocasionalmente.
Muy interesante las técnicas de las plantillas.

zoclorevnxrz
Автор

Gran maestro cree que podria hacer un curso de como crear interfaces gráficas y manejar opengl desde cero

mclovinbot
Автор

que buen video, en mi uni no me enseñaron nada de c++ moderno

orestescm
Автор

Hola profe, primero que nada decirle que usted es el mejor profesor de programación que he conocido y realmente agradezco que suba sus clases a youtube. Quería preguntarle una duda que tengo, no sé si sea tonta, pero no he entendido muy bien las respuestas que encontré. Resulta que a más bajo nivel la forma más rápida de acceder a memoria son los registros del procesador (refiriéndome únicamente a x86), los cuales se llaman rax, rdi, rdx, etc. Ahora, qué es lo que sucede si ejecuto dos programas escritos en ensamblador que utilizan esos registros al mismo tiempo, no sucedería un condición de carrera, cambio de contexto? Cómo se resuelve ese problema? De antemano muchas gracias

isaigm
Автор

utilised and enjoyed wNice tutoriallst increasing in value.

rtoto_