Creative Commons License krshock: insanidad garantizada por krshock está licenciado según la Creative Commons Atribución-No Comercial-Sin Derivadas 2.0 Chile License. excepto en los casos que se declare explícitamente otra licencia o autor.





Chileno, Talquino, Santiaguino y Talquino.

miércoles, octubre 10, 2012

labs: Sistema de particulas gravitatorias en javascript (update #001)

(no funciona en Internet Explorer)

Últimamente he estado algo fascinado con el concepto de los sistemas de partículas. Y me he dado un rato para experimentar con la idea. Aquí dejo una pequeña simulación 2D (físicamente inexacta) realizada en Javascript y Canvas.




Los valores utilizados para afinar la animación no siguen ningúna constante ni unidad de medida reconocible que permita una traducción directa a los de la mecánica clásica de newton. Esto sólo diversión y la conceptualización de una corazonada.

Lástima que nunca se formaron galaxias, esperaba galaxias :/

Obviamente es resultado del modelo matemático sobre-simplificado, un día de estos me haré un rato para estudiar y analizar el tema de forma más teórica.

update 11/10/2012:

Hay algunas cosas interesantes sobre este pequeño demo que valen la pena analizar. Por ejemplo, si tomamos en cuenta que en un frame, el vector de velocidad cada particula debe sumar la fuerza gravitacional  generada por la interacción con el total de partículas del sistema y definimos X como el número total de partículas del sistema (que en este ejemplo corresponderá a X=300) podemos calcular el número de interacciones que deben calcular necesariamente por cada frame de animación:

X*(X-1) = 300*(300-1) = 300*299 = 89.700 interacciones/frame

(X-1) se establece por lo innecesario de calcular la interacción de una partícula consigo misma, ya que el módulo del vector siempre correspondería a cero.
Tomando en cuenta lo anterior, si en un entorno de ejecucion ideal el demo se ejecuta a 60 frames por segundo. La velocidad de interacciones corresponderá a 5.382.000 (!) interacciones por segundo (89.700 x 60).

Números algo bestiales para un programa a primera vista tan simple. Por lo que queda hacerse la pregunta: ¿Que se hace en estos casos? ¿Se puede hacer algo para mejorar el rendimiento?

Existen dos aproximaciones (no excluyentes) a este problema. La primera, que desarrollaré brevemente en este post, consiste en acudir a un viejo amigo: la paralelización.
En Javascript, los WebWorkers explicados de manera ruda, corresponden a scripts ejecutándose en segundo plano. Lo que en primera instancia cubren nuestra necesidad básica: ejecución simultánea. Algo que cabe aclarar sobre Workers, es que en conceptos mas conocídos, estos se comportan como Subprocesos y no como Hilos. Lo que implica que los mismos se ejecutan en un espacio de memoria diferente al proceso padre (página html) y no comparten ninguna variable entre ellos. Por lo que el único intercambio factible de información , tanto de valores simples como de conjuntos de datos, es a través de mensajes.
Siguiendo con la primera aproximación, el cálculo paralelo de los vectores de fuerza utilizando WebWorkers permitiría dividir el volumen total de cálculos en varios sub-lotes, que al ser procesados de forma simultánea, disminuirán el tiempo de espera total por frame (si haces todo de forma correcta).
¿Funcionará? ¿Que aspectos hay que tener en cuenta? Bueno, eso lo dejaré pendiente para mi próximo update porque ahora... Se ha acabado mi tiempo libre ¡es hora de trabajar!



No hay comentarios.: