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.

SplinterGU

en la version de windows, a menos que hayas compilado desde los repositorios, no hay chequeos... pero dudo que eso este pasando... deberias ejecutar 4 gigas de procesos...

todavia no probe en windows. tengo que generar ejecutables nuevos... cuando se reusan los ids, no siempre hace el crash inmediatamente, puesto que depende si esos valores de id estan todavia en la matriz y algun animal intenta interractuar con esa posicion...

pero deberias haber ejecutado 4 gigas de procesos para que el contador rote, y de hacerlo, estaria dando id menores a 65536 y eso colisionaria con los tipos de procesos... asi que no creo que eso este pasando...

para que se entienda, el codigo que vos usas hace esto:

static int instance_maxid =  FIRST_INSTANCE_ID ;

y esto

int instance_getid()
{
    return instance_maxid++ ;
}

estas son las 2 unicas funciones para asignar ids, no se usa nada mas...

y los ids 0-65535 son reservados para los tipos de procesos... (TYPE xxx)

imaginate el resto...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

#61
Comprendo, entonces será que se repiten IDs...

4Gb de procesos en absoluto han dado tiempo de generarse (Creo...), pero 65536 sin duda alguna, enseguida pongo un contador total de procesos generados, si hace crash cerca de los 65536+ ya sabemos cuál es el problema.

Si ese es el problema, quizás los animalicos tendrían que comprobar con WHILE (exists(id)) cuántos procesos activos hay con ese ID o algo similar y suicidarse si hay más de uno...

Creo que hasta la noche no podré hacer nuevas pruebas pero te mantendré al corriente.

EDIT: Tengo el contador funcionando, espero el crash. Por cierto, se podría cambiar ese static int instance_maxid por un static long long int instance_maxid en el peor de los casos... ¿Algo así es lo que dices que hay hecho en la versión de Windows para llegar a los 4Gb de IDs?
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

splinter_work

#62
Creo que no logro explicarme correctamente... perdon... a ver si esta vez sale...

1) Los ultimos binarios liberados tienen las siguientes caracteristicas con respecto a las instancias:

    a) No tienen limite de id... este es desde 65536 hasta 4,294,967,295. (asi que si te da un id 65536+ no es ningun problema)
    b) Si se supera el limite (4,294,967,295) bennu (esto viene de fenix) empieza a asignar ids desde 0 en adelante, y eso esta mal, puesto que esos ids son reservados para los tipos de proceso (TYPE dentro de un getid, collision, etc). Incluso si alcanza nuevamente el 65536 en adelante puede pisar los id de procesos en ejecucion, lo cual desastroso.
    c) Las instancias son una lista hasheada de 256 elementos la cual puede tener varios procesos (instancias) por elemento.
    d) no hay limite en la cantidad de instancias concurrentes (las funciones tambien cuentan como instancias), salvo lo mencionado previamente.
    e) la asignacion de ids es ciclica

2) La nueva version del SVN, tiene las siguientes caracteristicas con respecto a las instancias.
    a) Tiene limite de id... este puede ser entre 65536 (10000h) y 131071 (1FFFFh) inclusive.
    b) Si se supera el limite, se busca el primer id libre y lo asigna, si no hay libre, falla la creacion del proceso.
    c) las instancias son una lista array de 65536 elementos, lo que permite/obliga que solo haya 1 proceso por elemento, y el acceso al mismo sea muy rapido.
    d) existe limite en la cantidad de instancias concurrentes (las funciones tambien cuentan como instancias), este limite es de 65536 instancias.
    e) la asignacion de ids es ciclica

Con respecto a tu otra pregunta, sobre el long long, debo decir que Bennu maneja datos de 32 bits... no se puede asignar elementos de 64bits, puesto que no seria posible manipularlos.

EDIT: Me olvide mencionar que los ids son elementos unicos, poner 2 ids igual es error, por lo que hacer getid reiterados no sirve para detectar si otro proceso tiene tu id... no deberia darlo, y si lo da, no tendrias forma de determinar que no eres tu, o que tu no eres el. En todo caso seria una condicion de bug con resultados inesperados.
Por otro lado, creo que el tema del crash en windows, aunque no descarto un bug en bennu, creo que podria deberse a que con el manejo de estas matrices y que no todo se esta controlando adecuadamente en el juego se esta pisando algun area de datos que no corresponde (concretamente dentro de la librender o datos que la lib render usa).

Windgate

Ok Splinter, ahora sí que ha quedado totalmente claro, espero que esa nueva versión del SVN se libere pronto, tiene buen aspecto eso de tener 1 única instancia por elemento en lugar de hashear, quizá se logre más eficiencia.

Las 65536 instancias concurrentes... No me parece que sean demasiadas, pero para lo que hago en Bennu ahora mismo es suficiente.

Desde luego no llego a los 4G (4,294,967,295) IDs distintos ni por aproximación, así que NO hay problema en que se repitan IDs, eso me queda claro.

Pero sigue estando el problema en Windows y no lo veo en Linux... En Linux ya van 160K animalicos distintos y subiendo y todo va bien, mientras que en Windows tengo SIEMPRE el error de ejecución en la librender que he comentado antes... Desconozco si se trata de un bug de Bennu, no me veo capaz de determinarlo, yo por ahora veo bastante bien claro el código que accede a la matriz y creo que no debería causar ese problema... Añado que uso un XP con Virtual Box en Ubuntu y 512Mb de RAM reservados para él... Pero se lo pasé a un amigo con XP en solitario y le ocurrió lo mismo, seguiré probando.

Chan, chan, chan... Tal vez haya que dejar en un fichero el número de animalicos a la hora del crash, datos de la matriz u otra info que ayude a determinar la causa del error... Como me jode que no funcione bien en Windows :'(

Por cierto, nadie más nos comenta nada en este hilo (SOCORRO!), la verdad es que hemos usado una terminología un poco friki, pero la idea de Animalicos es bastante sencilla en el fondo...
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

splinter_work

#64
A cuanto tiempo mas o menos hace el crash?
Compilaste en windows o usas los dcb generados en linux?
Seria bueno que agregues solo a modo de testeo en cada acceso a un array chequeo de limites... por ejemplo...


m[a][b][c]...


antes de eso, pongas


if ( a < 0 or a > max_a or
     b < 0 or b > max_b or
     c < 0 or c > max_c )
    say ( "Error in file=" + __FILE__ + " line="+ __LINE__ + " a="+ a + " b="+b+" c="+ c );
    exit(1)
end


EDIT: Reniego a aceptar el calificativo de "friki". COLASIÓNESE!

Windgate

#65
Vaya, no conocía la existencia de __FILE__ y __LINE__, parece una buena idea hacer eso.

En Windows XP el crash llega muy rápido, cuando empiezan a reproducirse llega el crash, nunca he conseguido una ejecución en XP sin crash.

Ahora mismo tengo... 413K+ animalicos generados en Linux y todo va perfecto. Por supuesto que en XP vuelvo a generar los .dcb, y un amigo en su XP también, y tiene el mismo crash.

Voy a probar ese chequeo de límites que propones.

De acuerdo, retiro lo de que ha sido friki, pero colasiónase tiene lo suyo... Nunca había oído esa palabra, lol

;D

EDIT: 530K+ animalicos generados y sigue estable en Linux, me iré a dormir y lo dejo hasta mañana, a ver si consigo sobrepasar los 4G y desbordar los ID. Creo que no uso ningún (type animalico) ni nada similar, así que no creo que haya problema en rebasar los 65K primeros IDs y seguir adelante hasta tener el error de ejecución más sangriento de la historia...
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

#66
Versión 0.9b, el crash en Windows XP sigue existiendo a veces transcurrido un tiempo, y parece que ocurre cuando hay mucha acumulación de animalicos. Probablemente el problema esté en la matriz y el acceso a zonas de memoria fuera de rango...

DESCARGAR ANIMALICOS 0.9b: http://www.mediafire.com/?0u3zmz0zmn3

Pongo esta nueva versión para que vean la pantalla de presentación del juego y la música, como novedad principal. La presentación es bonita y tras haber buscado mucho, la música me ha parecido apropiada para el juego y sobre todo graciosa xD

También hay un marcador que indica el número total de animalicos generados y alguna corrección en las estadísticas asignadas a cada animalico para lograr más equilibrio en el ecosistema y evitar que todos tengan la misma longevidad inicial y mueran a la vez, ahora hay un cierto margen de -10,+10.

Y bueno, también alguna puntualidad más en las que no merece la pena profundizar demasiado. Disfrutad!

EDIT: 2,000,000 de animalicos generados en Linux y todo ok, estoy pensando que quizás se trate de algún bug en la versión de Windows.

EDIT 2: He probado a actualizar todas las DLL de Windows con la RC 1.0.0 de Bennu, pero el problema persiste. Ando un poco ocupado, pero en cuanto saque un rato me pongo a debugear todo lo posible.
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