Spore 2D (Animalicos)

Started by Windgate, May 17, 2009, 05:17:32 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Windgate

Uf, he tenido problemas IN-CRE-I-BLES debido a un = que había puesto en un condicional en lugar de un == y hacía que 2 procesos al intentar reproducirse terminaban siempre teniendo el mismo tipo...

Y otro muy muy gordo al posicionar los hijos, que por un error matemático me tomaban la coordenada 0,0 y aparecían siempre en la esquina superior izquierda de la pantalla, no me estaba dando cuenta porque no los veía, incluso había errores en las estadísticas. Casi me vuelvo loco pero lo he conseguido estabilizar :D

He metido mejoras varias en el rendimiento pero sigue sin convencerme :-\... Todavía no lo subo por eso, aguarden!
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Windgate

#46
Subo la versión 0.6 y 0.8 con mejoras diversas, las estadísticas muestran la matriz indicando qué especies se alimentan de cuáles y he mejorado el rendimiento todo lo que he podido.

DESCARGAR v0.6: http://www.mediafire.com/?jzjzno0qj1c (No equilibrado)

DESCARGAR v0.8: http://www.mediafire.com/?oxgrm2gijbx (Equilibrado!!!)

DESCARGAR v0.8b: http://www.mediafire.com/?thlnnggyuzy (Integrado un scroll con desplazamiento y alguna mejora puntual!)

He modificado las estadísticas de cada especie de forma que más o menos tengan la misma probabilidad de sobrevivir, aunque normalmente suelen extinguirse unas cuantas y sobrevivir como mucho 3 ó 4 de las 8 especies iniciales, es un horror equilibrar el ecosistema, tiempo al tiempo. Rectifico, la 0.8 está jodidamente bien equilibrada, procedo a añadir un scroll scroll añadido en la 0.8b.

¿Sugerencias?


Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

SplinterGU

tras hacer varios cambios en el manejo de las instancias... y tras 3 dias de debugear un bug en el core que no existia, (ya que se me caia tu codigo) me encontre con que el bug esta en tu ultima version, tu matriz de posicion no limpia el valor anterior cuando un objecto cambia de posicion... y eso produce que al tiempo cuando el id del proceso se reuse provoque una violacion de segmento... termino de probar y en un rato subo un fix a tu version...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

Fix


PROCESS animalico(x,y, tipo_inicial)
PRIVATE
int ID_mover;
BEGIN
tipo=tipo_inicial; //Adoptamos el tipo de animalico con el que nos han invocado
alimento=hambre[tipo]; //Obtenemos nuestro alimento inicial
vida=longevidad[tipo]; //Obtenemos nuestra vida inicial
file=fpgs[C_COLORES]; //Obtenemos el fichero de gráficos que nos corresponde
graph=tipo; //Obtenemos el número de gráfico que nos corresponde
size=TAMANO_INICIAL; //Obtenemos el tamaño inicial que nos corresponde
num_animalicos[tipo]++; //Incrementamos en 1 el número de individuos
ID_mover=mover(); //Invocamos al proceso que nos mueve por el mundo

LOOP
vida--; //Envejece y sufre los efectos del hambre
alimento--;

IF (interactuar()==-1) //Si no pueden posicionarse tras interactuar morimos por aplastamiento
BREAK;
END
IF ((vida<=0) OR (enfermedad>contagio[tipo]) OR (alimento<0)) //Muerte de los animalicos
BREAK;
END

FRAME;
desposicionar(id); //El animalico abandona su posición del tablero para tomar una nueva
END
ONEXIT
signal(ID_mover,S_KILL); // y de moverlos por el mundo
desposicionar(id); //Al morir se desposiciona siempre
num_animalicos[tipo]--; //Decrementa el número de animalicos de su especie
END





FUNCTION desposicionar(int pid)
//Elimina del tablero un proceso animalico poniendo un -1 en el hueco de la celda que le correspondería
PRIVATE
int i;
no_existe=TRUE;
BEGIN
x=pid.x/PROPORCION_HORIZONTAL_TABLERO; //Obtenemos la x que le correspondería en el tablero
y=pid.y/PROPORCION_VERTICAL_TABLERO; //Obtenemos la y que le correspondería en el tablero
FROM i=0 TO MAX_ANIMALICOS_CELDA-1; //Calculamos si el hueco que le corresponde en la celda
IF (tablero[x][y][i]==pid)
tablero[x][y][i]=-1;
no_existe=FALSE;
END
END
IF (no_existe) RETURN -1; //Si no se encuentra el animalico devolvemos error (-1)
ELSE RETURN i; END //En otro caso devolvemos el número de hueco en el que se encontraba
END



PROCESS mover()
PRIVATE
int avance_x=0, avance_y=0;
animalico yo;
BEGIN
yo=father;
LOOP
avance_x+=rand(-1,1);
avance_y+=rand(-1,1);
IF (avance_x<-velocidad[yo.tipo])
avance_x=-velocidad[yo.tipo];
ELSIF (avance_x>velocidad[yo.tipo])
avance_x=velocidad[yo.tipo];
END
IF (avance_y<-velocidad[yo.tipo])
avance_y=-velocidad[yo.tipo];
ELSIF (avance_y>velocidad[yo.tipo])
avance_y=velocidad[yo.tipo];
END

       desposicionar(father);

father.x+=avance_x;
father.y+=avance_y;
IF (father.x>RESOLUCION_X-1)
father.x=0;
END
IF (father.x<0)
father.x=RESOLUCION_X-1;
END
IF (father.y>RESOLUCION_Y-1)
father.y=0;
END
IF (father.y<0)
father.y=RESOLUCION_Y-1;
END
FRAME;
END
END


Creo que esos son todos los cambios necesarios...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

Arg, siento haberte hecho trabajar para nada...  :-\

Pero... ¿Ese error te lo ha dado en Windows o en Linux, con cuál versión de animalicos? Créeme que llevo varios días haciendo cambios y cambios en Ubuntu y todavía no he tenido ningún crash desde la 0.6, en la que probablemente pasaba lo que tú dices, he corregido diversos errores desde entonces y he cambiado un poco el método para posicionar/desposicionar en el tablero...

Pongo la última versión, ahora son 16 especies, y de hecho pueden ser N especies con sólo modificar una CONST del juego. Incluso las estadísticas de pantalla se escriben ordenadamente según el número de especies, pongo una captura y el link de descarga del juego, (pendiente de actualizar con tu corrección):

[/size]

Si alguien vuelve a tener algún error de ejecución que me consulte please!!! Indicando sistema operativo.
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

SplinterGU

En linux me fallo, pero nada tiene que ver con el operativo... tiene que ver con el nuevo limite en la cantidad de instancias permitidas (65535 concurrentes), que permiten ahora hacer algunas optimizaciones... entonces sucede que cuando el contador de ids da la vuelta y el id que se asigno mucho tiempo atras se asigna a un nuevo tipo de proceso (diferente al anterior), al acceder a la variable tipo de un proceso que no es del tipo correcto, pero al estar su id en la matriz que no se limpio se accede, el valor de tipo da un valor fuera del rango de la matriz y provoca una violacion de segmento.

Ahora esto va teniendo pinta de juego... a ver....
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

Ahora mismo la matriz debería limpiarse correctamente poniendo un -1 en esa posición cada vez que un proceso muere o cambia a otra posición distinta... Como te digo, he hecho decenas y decenas de pruebas sin errores de ejecución y modificando parámetros de mil maneras distintas.

Esperemos una segunda opinión y si alguien más tiene problemas uso tu código Splinter.

Tengo preparado ya el mapa de durezas que indica el habitat en función de la posición en el mapa, para que las distintas especies tengan asociado un hábitat determinado y se vean bonificadas cuando se encuentren en él y cosas así.

Miles de cosas por hacer pero me está gustando la experiencia xD
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

SplinterGU

esta version tambien me da "violacion de segmento"...

la cosa es que en la version que estas usando los ids de procesos son entre 65536 y 4294967295, en la nueva version son entre 65536 y 131071... luego se reutilizan, y en la version que vos tenes (la del svn) el id de proceso si lleva al limite empieza a pisar los tipos de procesos y a los ids... supongo que si llega al limite, directamente revienta todo...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

#53
demas esta decir, que al no limpiar, podemos interactuar contra procesos que ya no estan realmente en esa posicion.

EDIT:
otra cosa, el tipo de dato "bool" no existe.

EDIT2:
Efectivamente, se soluciona desposicionando al objeto antes de cambiar de posicion.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

#54
Increíble, quizás no he tenido problemas de ejecución en Ubuntu porque he realizado tantísimas pruebas que no las dejo demasiado tiempo en funcionamiento.

Un amigo desde Windows XP me ha dicho que le daba un erorr en librender.dll y yo he tenido ese mismo error en XP virtualizado desde Ubuntu, imagino que todo será parte del mismo problema.

Una lástima, procedo a introducir las modificaciones que has propuesto... Splinter, Splinter, Splinter, qué sería de mí sin tí... Estoy preparando las pantallas de presentación del juego y otras cosas reutilizando los .prg de mi viejo Just Fantasy (Tengo para audio, animación, instrucciones, manejo del mouse...).

Por supuesto estás incluído en los créditos de agradecimiento de la pantalla de presentación, junto con la URL de este foro, faltaría más.

EDIT:
El tipo bool no existe... Soy un mamón... Menos mal que me funcionaba... :o
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Windgate

He introducido tu modificación Splinter.

Sólo había un problema: Mi nueva versión 0.9 hacía que cada animalico interactuara con el entorno cada X frames (Indicados por una CONST), ahora he hecho que la interactuación sea para TODOS los frames y así hacer más sencillo incluir tu modificación. Pero el error de ejecución persiste en Windows...

Debo añadir que todavía no he tenido un problema de ejecución en Linux... Me ha dado tiempo de hacer un sandwich y degustarlo entero, y mis animalicos aquí siguen apareándose y comiéndose unos a otros...

Es muy tarde, mañana sigo haciendo pruebas, estoy demasiado enganchado a este juego... A pesar de que tengo mucho trabajo que hacer no puedo dejar de programarlo y programarlo :-\
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

SplinterGU

ah, por eso es que en mi version se extinguen muy rapido... voy a quitar eso de cada X frames, a ver que pasa...

saludos, buen trabajo...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

Ya está, creo que lo tengo, tenía un problema porque ahora al usar posicionar() su father no era el animalico en sí, sino la función mover(). Lo he arreglado con un parámetro pid, como has hecho tú con la función desposicionar().

También he quitado eso de interactuar cada X frames, pero mañana volveré a ponerlo, interactuar() es la función que más recursos consume, y veo que es la que más resiente la ejecución, por eso es mejor no usarla en todos los frames sino cada cierto tiempo, además, tampoco tiene sentido que a cada frame el animalico intente reproducirse y comer... Es excesivo.

En cuanto al tablero, he realizado pruebas con tableros de distinta "resolución", y el tamaño del tablero no afecta al rendimiento, de hecho con tableros de 300Kb y tableros de 72Mb obtengo prácticamente el mismo rendimiento en fps.

Lo dicho, mañana sigo con ello, dejo una ejecución funcionando en XP, lleva 5 minutos funcionando sin problemas y espero que mañana por la mañana siga ahí.

Gracias de nuevo Splinter!!!
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

SplinterGU

saludos, de nada... un karma para ti...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

#59
Sigo teniendo el problema, en Windows XP el informe me dice:

AppName: bgdi.exe    AppVer: 1.0.0.1    ModName: librender.dll
ModVer: 0.0.0.0    Offset: 00002dde

En Linux no sé donde se encuentra el stderr o similar.

Al parecer el crash sucede cuando muchos procesos con la misma longevidad mueren al mismo tiempo transcurrida su vida...

He convertido muchos PROCESS en FUNCTIONs para evitar posibles problemas de que 2 procesos distintos (p. ej. interactuar) pudiesen mandar una señal de muerte al mismo proceso, pero no consigo nada.

También he evitado mandar señal de muerte a procesos a los que les queda 1 sólo punto de vida, ya que morirán al frame siguiente y quería evitar el mismo problema...

Pero sigo teniendo el mismo error.

Estoy desposicionando antes de mover y posicionando justo después, todo ello lo hace una FUNCTION por lo que es como si se encargase el propio proceso.

Voy a probar a asignar longevidades un poco más aleatorias a ver si sucede lo mismo, y si es así se trata de que se vuelven a asignar los mismos IDs como dijiste ayer Splinter... Una duda: ¿Antes de asignar un nuevo ID se comprueba que ese ID no exista ya? Me refiero a cuando se "terminan" los IDs disponibles y el contador da la vuelta.

EDIT: He realizado una comprobación, y cuando se "terminan" los IDs y vuelven a asignarse los mismos el juego continúa ejecutando sin problemas. También he comprobado que si las longevidades no son exactamente las mismas y, por tanto, no hay muertes masivas, la ejecución tarda más tiempo en hacer crash... No obstante sigue haciendo crash transcurrido un tiempo...
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es