Procesar y borrar elementos de una lista en O(n)

Voy a explicar que elección de diseño he elegido en mi juego para la gestión de la lista de entidades.

En todo videojuego hay una lista de entidades que necesitan hacer en su máximo nivel de abstracción 2 cosas:

  1. Procesar todos los elementos. Esto es que cada elemente tiene un metodo, tipicamente refrescar() o update() que abstrae toda la secuencia de proceso que tiene que hacer.
  2. Borrar los elementos que han muerto o a terminado su ciclo de vida.

Poder borrar el elemento de lista me dificulta la implementación, asi que he optado por que el nodo tenga un método en el que solicita la liberación. Cuando llege su turno será eliminado. Esto tambien lo hago así por que physX exige borrar sus entidades en puntos muy concretos de muy código. Cuando no lo hacía así cada 5 min de juego tenía un «segmentation fault» que me crasheaba el juego.

Hay infinitos ejemplos por los que hay que borrar una entidad. Un bot que ha cumplido su objetivo.
Por ejemplo, suponer que una entidad (un proyectil en concreto) que se mueve, esto lo hace durante el refresco, se sale del mapa, cuando se salga queremos borrarlo. Por tanto en pseucódigo será.

if(estoyDentroDeLimites())
	avanzar();
else
	pedirLiberacion();

Cuando a otro nivel llamamos al proceso de las entidades, el proceso debería quedar algo así.

void procesarSeleccionados ( list<Nodo*> * lista )
{
	Nodo * aux = NULL;
	list::iterator it = lista->begin();
	while(it != lista->end())
	{
		aux = *it;
		if(aux->getPedirLiberacion() && aux->liberar())
		{
			delete aux;
			it = lista->erase(it);
		}
		else
		{
			aux->refrescar();
			i++;
		}
	}
}

Estoy utilizando una lista del STD.  Comentar:

  • El if() podríamos sustituirlo por la condición de borrado. En este ejemplo significa:
    • si quieres que te borren. getPedirLiberacion()
    • Y te has borrado correctamente. && aux->liberar()
  • La función erase() borra a lo que apunta el iterador y automaticamente te avanza el iterador, teniendo siempre un iterador válido. Por eso el i++ esta en el else, si lo pusioramos fuera nos saltariamos un elemento de la lista cada vez que borremos.

NVIDIA quiere que ATI implemente PhysX

Me ha sorprendido esta noticia gratamente, parece increible pero NVIDIA esta buscando una alianza con su enemigo ATI, posiblemente para propagar este gran motor físico lo máximo posible, reduciendo las posibilidades de la batalla que esta ocurriendo ahora entre PhysX vs Havok.

Actualmente cualquier tarjeta gráfica funciona con PhysX por software, pero la idea es implementar física que requiera grandes calculos por separado (en paralelo) del render. Actualmente las cpu hacen este trabajo, y lo hacen muy bien, pero cuando esto este más implementado se liberara a la cpu de este tipo de trabajo para que puede realizar tareas como ray-tracing en tiempo real. (Aunque pronostico que en 10 años habra tarjetas de luz con raytracing por hardware). La CPU de forma ideal solo debería en cargarse la lógica básica del juego, calculos (pero no de matrices, que para eso esta la grafica), y preocuparse de la I/O.
NVIDIA esta implemente PhysX por hardware mediante CUDA, CUDA es un lenguaje de programación de bajo niveñl para gráficas nvidia que permite realizar calculos utilizando el hardware en vez de la CPU, pues bien ATI tiene algo parecido y NVIDIA le esta pidiendo que implemente PlysX por hardware.

Mas detellas en la fuente : http://www.tgdaily.com/html_tmp/content-view-38283-135.html

Como hacer juegos profesionales: Linux + OGRE + PhysX 2ª Parte

1ª Parte : Introducción
2ª Parte : Nuestra Primera aplicación

Nuestra primera aplicación

Vamos a crear 2 cubos, de manera que lo dejaremos caer, y se comportan con una física real. Al principio los tutoriales serán mucho de copy & paste, para entrar a la acción rapidamente, despues se ira explicando más cada cosa.

Empezamos a escribir código

  • Creamos una carpeta para empezar nuestro proyecto : mkdir -p ~/proyectos/juegosProfesionales
  • Nos cambiamos a nuestro nuevo directorio de trabajo : cd ~/proyectos/juegosProfesionales
  • Creamos un main.hpp : gedit main.hpp main.cpp
  • En el main.hpp pegamos esto :
    Seguir leyendo

Como hacer juegos profesionales: Linux + OGRE + PhysX 1ª Parte

1ª Parte : Introducción
2ª Parte : Nuestra Primera aplicación

Llevo mucho tiempo tratando de hacer juegos, no soy ningún experto, pero tratare de explicar lo que ya se y lo que vaya aprendiendo, en una serie de posts sin un buen orden incremental de dificultad.

Inicialmente empeze en java 2D con un juego tipo worms gracioso, enseguida quise probar OpenGL a pelo con los tutoriales de NeHe, lentamente me hice un motor gráfico y un motor físico muy básico. Trabajando por individual solo podemos llegar a nivel amateur y eso si aprender un montón, cuando ya os meteis con biblotecas tan profesionales como ogre o physx es muy recomendable que esteis algo familiarizados con formas más caseras. Pero bueno tampoco es imprescindible.

Yo voy a suponer durante esta tira de posts que teneis unos conocimientos básicos de programación 3d y algo avanzados de c++. Todo aquello que no se entienda pos lo hablamos entre todos en los comentarios.

Comentamos nuestra plataforma de desarrollo:
Seguir leyendo