Implementación de un sistema de partÃculas
Los sistemas de partÃculas son utilizados en los juegos para crear una gran cantidad de efectos. Su implementación es mucho más sencilla de lo que parece, veamos como hacerlo utilizando C# y Managed DirectX.
Un sistema de partÃculas es una colección de pequeños objetos, denominados partÃculas, que se comportan de un modo predefinido para simular distintos efectos gráficos como humo, nieve, fuego, chispas, explosiones, hojas volando al viento, vapor, etc. Cada partÃcula posee propiedades que definen su comportamiento en el mundo asà como su aspecto. Usualmente una partÃcula se encuentra compuesta por un pequeño mapa de bits aunque también podrÃa ser un polÃgono o un conjunto de ellos.

Figura 1. El juego Freedom Force hace un uso intensivo de los sistemas de partÃculas
La implementación de un sistema de partÃculas puede ser bastante sencillo, aunque esto dependerá en parte del tipo de simulación que deseemos efectuar. Algunos sistemas implementan colisiones entre las partÃculas, algo costoso en términos de CPU pues la cantidad de partÃculas de un sistema suele ser elevada.
Arquitectura de un sistema de partÃculas
Todo sistema de partÃculas especifica un punto desde el cual las partÃculas nacen al mundo (aparecen en pantalla). Este punto se denomina generador o emisor y suele no poseer una representación gráfica (es invisible).
Es posible que, en función del tipo de sistema de partÃculas que deseemos crear, la generación no sea puntual, es decir que las partÃculas aparecerán en pantalla desde distintas posiciones (lluvia, nieve). Estas posiciones pueden ser totalmente aleatorias o pueden estar restringidas a un segmento o a una superficie.

Figura 2. El generador es el punto desde el cual nacen las partÃculas
Estados de una partÃcula
Las partÃculas poseen un ciclo de vida:
. Nacen, aparecen en pantalla desde el generador.
. Viven, durante un perÃodo de tiempo durante el cual se desarrollan modificando una o varias de sus propiedades: posición, orientación, tamaño, color, etc.
. Mueren, retornando al repositorio de partÃculas disponibles para una nueva generación.
Aspectos de implementación
El diagrama de clases simplificado general que desearemos implementar es el siguiente:
![]()
Figura 3. Diagrama de clases estático
Una clase serÃa la encargada de crear y controlar las partÃculas, y la clase partÃcula (que podrÃa ser una estructura) contendrÃa las propiedades de la partÃcula en cuestión.
Pero analicemos más detalladamente nuestra estrategia. Si deseamos poder poner en pantalla una gran cantidad de partÃculas deberemos tener algunas consideraciones en cuenta.
Idealmente el sistema de partÃculas comienza sin poseer ninguna partÃcula bajo su gestión, pues aún no ha nacido ninguna. Pasado un cierto tiempo se creará la primer partÃcula, cuando esto ocurra se fijarán ciertas propiedades iniciales de la partÃcula para que se muestre en pantalla según el efecto que deseemos simular (se le fijará la posición del generador, se le dará un color, un tamaño, se le fijará una velocidad inicial, etc.).
Luego, cuadro tras cuadro iteraremos por una lista donde estarán todas las partÃculas vivas y modificaremos algunas de sus propiedades según su ciclo de vida.
Finalmente, las partÃculas agotarán su tiempo de vida, momento en el cual serán eliminadas. Por supuesto, que esto último no ocurre para todas las partÃculas simultáneamente sino que van muriendo con la misma velocidad con la que fueron naciendo.
En una implementación trivial el nacimiento implicarÃa asignación de memoria, y la muerte implicarÃa desasignación (o al menos, por estar trabajando en C#, la indicación explÃcita que una determinada estructura de datos ya no es necesaria para nuestro programa).
Sin embargo, esto acción podrÃa acarrear algunos problemas de desempeño por parte de nuestra aplicación. ¿Que ocurrirÃa si el intervalo de generación de partÃculas fuese muy bajo y el tiempo de vida de cada partÃcula muy alto? CrearÃamos muchÃsimas partÃculas hasta que, posiblemente, la aplicación comenzara a ralentizarse, sin mencionar que podrÃamos no saber a ciencia cierta la cantidad de memoria utilizada por nuestra aplicación.
Por lo tanto, deberemos emplear alguna estrategia que sea mas amigable con los recursos del sistema (CPU, memoria y GPU) y que sea más fácil de predecir en cuanto a los recursos que utilizará independientemente de la frecuencia de generación o el tiempo de vida de las partÃculas.
Nuestra estrategia consistirá en pre-generar una cantidad de partÃculas máxima que utilizará nuestro sistema y un mecanismo para reciclar partÃculas muertas sin reasignar memoria.




lindo tutorial, gracias!
Muy bueno
Oe man…precioso tutorial… te pasaste on… Por los diagramas de clases y diagramas de flujos y la paciencia que tienes para explicart …te puyedo asegurar que tienes dotes de profesor on..Bueno espero que sigas subiendo mas tutoriales on… son super buenos…A solo queria preguntarte si pronto vas a subir el tutorial de MD2(segunda parte y posteriores me serian de gran utilidad)
Oe man buen tutorial on(te pasaste)… por los graficos y diagramas te puedo asegurar que tienes dotes de profe on… sinceramente bueno …sigue colgando mas tutoriales on serian de mucha ayuda… A man ya ps acuerdate de subir el tutorial MD2 (segunda parte)
Man buenazo on te pasaste …se ve que tienes dotes de profesor
sinceramente myu bueno man…tienes dotes de profesor on…
muy bueno muy bueno.