PDA

Ver la versión completa : Sistema de partículas



miq01
14/01/2006, 01:12
Hola. He estado haciendo pruebas con un sistema de partículas a ver qué tal iba en la consola, y tira bien, pero va un poco lento.

Hay 5000 partículas en pantalla y uso números reales (para operaciones aritméticas muy sencillas, nada de sqrt y cosas por el estilo), y creo que con las SDL aceleradas por hardware debería ir más rápido. Yo las tengo, pero cuando ejecuto la pantalla se queda negra y no se puede salir. He probado a recompilarlas (porque creo que las ya compiladas son una versión más antigua) pero me pierdo en el cofigure. ¿Alguien que las haya compilado me puede decir como modificar el configure para que ejecute arm-linux-gcc en lugar de gcc desde Linux? O, bueno, si alguien las ha recompilado y van bien, ¿sería mucho pedir que compilara mi código a ver si realmente va más rápido? :)

En el zip está el ejecutable y el código fuente. Con el stick se mueve el cursor, pulsando B se apartan las partículas alrededor del cursor, pulsando A se reinicializa la posición de las partículas, y con START se sale.

efegea
14/01/2006, 01:18
./configure --host=arm-linux

En mi caso el compilador se llama arm-unknown-linux-gnu-gcc por lo que pongo ./configure --host=arm-unknown-linux-gnu

miq01
14/01/2006, 02:17
./configure --host=arm-linux

En mi caso el compilador se llama arm-unknown-linux-gnu-gcc por lo que pongo ./configure --host=arm-unknown-linux-gnu
Gracias. Pero al hacer make empieza a compilar y al cabo de un rato aparece esto al intentar compilar SDL_x11events.c:


SDL_x11events.c: In function 'X11_Pending':
SDL_x11events.c:451: error: impossible constraint in 'asm'
make[3]: *** [SDL_x11events.lo] Error 1
He mirado qué hay en esa línea, i lo que hace es ejecutar

FD_ZERO(&fdset);
¿Alguna idea? Supongo que FD_ZERO es una macro pero es que no la encuentro. Efegea, ¿podrías adjuntar tus SDL aceleradas por hw?

efegea
14/01/2006, 02:29
¿Te refieres a adjuntar los binarios ya compilados? Lo tengo dificil porque no se cuales archivos tengo que coger. Estan instalados en /usr/arm-unknown-linux-gnu mezclados con muchas mas librerias y el compilador cruzado.

Si sabes cuales son los archivos los comprimo en un momento y los adjunto

miq01
14/01/2006, 02:35
¿Te refieres a adjuntar los binarios ya compilados? Lo tengo dificil porque no se cuales archivos tengo que coger. Estan instalados en /usr/arm-unknown-linux-gnu mezclados con muchas mas librerias y el compilador cruzado.

Si sabes cuales son los archivos los comprimo en un momento y los adjunto
Sí. Me refiero a los binarios. Creo que con libSDL.a, libSDL.la y libSDL.so bastaría.

efegea
14/01/2006, 02:42
Aqui los tienes. en mi sistema libSDL.so es un enlace simbólico a libSDL-1.2.so.0.7.0, por lo que te adjunto este

Espero que te sirva :)

miq01
14/01/2006, 02:55
Muchas gracias. :)

Lo he probado y no. Se queja de esto:

/home/miq/gp2x/paeryn/lib/libSDL.a(SDL_fbevents.o): In function `FB_OpenMouse':
/home/frajan/tmp/SDL_gp2x/src/video/fbcon/SDL_fbevents.c:505: undefined reference to `__ctype_b'
/home/miq/gp2x/paeryn/lib/libSDL.a(SDL_fbelo.o): In function `eloSendQuery':
/home/frajan/tmp/SDL_gp2x/src/video/fbcon/SDL_fbelo.c:309: undefined reference to `__ctype_toupper'
/home/miq/gp2x/paeryn/lib/libSDL.a(SDL_fbelo.o): In function `eloInitController':
/home/frajan/tmp/SDL_gp2x/src/video/fbcon/SDL_fbelo.c:420: undefined reference to `__ctype_tolower'
collect2: ld returned 1 exit status
make: *** [particlesystemdemo.gpe] Error 1
Bueno, ya me lo miraré con calma que ahora me voy.

Jan_Europa
14/01/2006, 03:19
mira he buscado el error googleando (no tenía otra cosa que hacer la verdad ;)

y mas o menos dicen que es por mezclar librerias compiladas con distinta version

(vamos que con lo que compiló el libSDL.a no es el mismo que el tuyo y se vuelve
piripi)

Jhonnystorm
14/01/2006, 04:53
me gusta mucho el efecto de particulas que has creado, tienes muchas posibilidades de uso, lastima que en fenix sea todavia mucho mas lento (ya lo he probado yo), iria muy bien para generar efectos.

miq01
14/01/2006, 09:52
mira he buscado el error googleando (no tenía otra cosa que hacer la verdad ;)

y mas o menos dicen que es por mezclar librerias compiladas con distinta version

(vamos que con lo que compiló el libSDL.a no es el mismo que el tuyo y se vuelve
piripi)
Gracias por buscarlo. :) A ver si consigo compilar las SDL aceleradas por mí mismo, que voy un poco pez con los configures y a la mínima que da un error de compilación raro ya no sé por dónde tirar.


me gusta mucho el efecto de particulas que has creado, tienes muchas posibilidades de uso, lastima que en fenix sea todavia mucho mas lento (ya lo he probado yo), iria muy bien para generar efectos.
Yo hice algo con Fenix, pero ya me acuerdo demasiado. ¿Usas un proceso por partícula? Si es así, ¿no hay una manera más sencilla? Es que recuerdo que los procesos heredaban una serie de propiedades (size, alpha, ...) que en las partículas no son necesarias.

Topochan
14/01/2006, 16:58
He mirado el codigo fuente y he visto que inicias las sdl con SWSURFACE, si vas usar aceleracon por hardware cambialo a HWSURFACE sino no se notara los cambios, pues no accedera a la memoria de video, sino a la ram(mas lento en este caso). de todas maneras haz la prueva con HWSURFACE sin aceleracion y mira si gana velocidad.


Saludos

Puck2099
14/01/2006, 17:49
He mirado el codigo fuente y he visto que inicias las sdl con SWSURFACE, si vas usar aceleracon por hardware cambialo a HWSURFACE sino no se notara los cambios, pues no accedera a la memoria de video, sino a la ram(mas lento en este caso). de todas maneras haz la prueva con HWSURFACE sin aceleracion y mira si gana velocidad.


Saludos

Efectivamente, para usar las SDL por Hard tienes que definir las superficies como HWSURFACE o se queda la pantalla en negro sin más.

Por otro lado, si usas las SDL "normales" (sin aceleración) no puedes definir la superficie como HWSURFACE o se quedará igualmente con la pantalla en negro.

Saludos

Jhonnystorm
14/01/2006, 18:09
Yo hice algo con Fenix, pero ya me acuerdo demasiado. ¿Usas un proceso por partícula? Si es así, ¿no hay una manera más sencilla? Es que recuerdo que los procesos heredaban una serie de propiedades (size, alpha, ...) que en las partículas no son necesarias.

si uso un proceso por particula, y una que no les "heredes" la propiedades de size, angle y tal, se relantiza mucho el sistema, es en mi pc y cuando hay unas 500 particulas se nota la relantizacion bastante (tengo un 2800, 1gb de ram y una targeta X700, vamos de sobra), de todas maneras seguire probando a mejorarlo ya que en mi juego lo ya he metido una fuente que emana particulas de colores y para que vaya fluido de momento solo salen un max de 30 particulas por segundo. :(

no se ve muy bien pero te envio un pequeño video y lo ves.....con la cantidad tan baja de particulas y en la gp32 no pasa de 30 frames.

tomo
14/01/2006, 18:23
Hm? Memoria de video? Pero la RAM no es compartida? Y otra pregunta... Las SDL aceleradas por HW usan el 2º procesador? Y si es así, usarlas siempre conllevará más gasto de batería, no?

Edit: Jhonnystorm, me encanta la pinta de esa escena xD

Puck2099
14/01/2006, 18:29
Y otra pregunta... Las SDL aceleradas por HW usan el 2º procesador? Y si es así, usarlas siempre conllevará más gasto de batería, no?

No, solo usan el primero, son aceleradas porque es el propio procesador el que realiza ciertas tareas (pintar cuadrados, blittings...) liberando al programa principal de dicha carga.

Saludos

Jhonnystorm
14/01/2006, 18:38
Edit: Jhonnystorm, me encanta la pinta de esa escena xD

Gracias hombre, reconforta saber que gusta tu trabajo ;)

BuD
14/01/2006, 19:38
./configure --host=arm-linux

En mi caso el compilador se llama arm-unknown-linux-gnu-gcc por lo que pongo ./configure --host=arm-unknown-linux-gnuBueno, no se si os sirve ya, pero para los configures tambien tienes q poner las rutas de las librerias y de los ejecutables, en mi caso es:
./configure --prefix=/opt/gp2x-arm-elf/gcc-4.0.2-glibc-2.3.5/arm-gp2x-linux/ --exec-prefix=/opt/gp2x-arm-elf/gcc-4.0.2-glibc-2.3.5/arm-gp2x-linux/ --host=arm-gp2x-linux

Otra cosa, en PATH deberia estar la carpeta siguiente:
/opt/gp2x-arm-elf/gcc-4.0.2-glibc-2.3.5/arm-gp2x-linux/bin
A partir de aqui, en vez de usar los binarios sdl-config de /usr/bin, usara los de tu cross-compiler.
Si funcionara, no te pasaria eso de las SDL_X11 (Lo se por experiencia de compilacion de Battle for Wesnoth [wei] )

efegea
14/01/2006, 20:12
He compilado una versión con aceleración por hardware pero se cuelga la consola al ejecutarla y se queda la pantalla en negro (aunque pulse start no sale al menu) :confused:

He cambiado SDL_SWSURFACE por SDL_HWSURFACE asi que por eso no es, no lo entiendo :confused:

BuD
14/01/2006, 20:54
He compilado una versión con aceleración por hardware pero se cuelga la consola al ejecutarla y se queda la pantalla en negro (aunque pulse start no sale al menu) :confused:

He cambiado SDL_SWSURFACE por SDL_HWSURFACE asi que por eso no es, no lo entiendo :confused:En la funcion SDL_Init(), en el argument flags, añade: "SDL_INIT_NOPARACHUTE" a ver si te funciona...

efegea
14/01/2006, 21:01
En la funcion SDL_Init(), en el argument flags, añade: "SDL_INIT_NOPARACHUTE" a ver si te funciona...

No es eso :(

Estoy pensando que tal vez sea porque accede directamente a los pixeles, y no bloquea la surface antes.

Lo he ejecutado desde sterm y no parece que haya ningun segmentation fault ni el error ese del "parachute" que suele escupir las SDL

efegea
14/01/2006, 21:21
Efectivamente, era lo que yo decia. Antes de acceder directamente a los pixeles hay que usar SDL_LockSurface(surface); y SDL_UnlockSurface(surface); detras

Ahora si funciona

sistema de particulas con aceleracion por hardware :D

Puck2099
14/01/2006, 21:32
Efectivamente, era lo que yo decia. Antes de acceder directamente a los pixeles hay que usar SDL_LockSurface(surface); y SDL_UnlockSurface(surface); detras

Ahora si funciona

sistema de particulas con aceleracion por hardware :D

efegea, ¿no te da ningún problema?, ¿solo has cambiado el SWSURFACE por HWSURFACE?

Yo tengo hecho un ejemplo y, aunque con la aceleración va el doble de rápido que sin ella, la pantalla parpadea de la hostia y no se porque puede ser...

miq01
14/01/2006, 21:33
Efectivamente, era lo que yo decia. Antes de acceder directamente a los pixeles hay que usar SDL_LockSurface(surface); y SDL_UnlockSurface(surface); detras

Ahora si funciona

sistema de particulas con aceleracion por hardware :D
Ostras, ahora no tengo mucho tiempo de responder.

Gracias por probarlo, pero a mí se me sigue quedando en pantalla negra. Y otra cosa, sí que uso SDL_LockSurface y la de desbloquear, en la función Draw de ParticleSystemDemo.cpp.

Respecto a lo de tener que usar HW_SURFACE en lugar de SW_SURFACE, ya lo sabía, lo que pasa es que como mi versión no estaba acelerada, tuve que dejar el segundo.

efegea
14/01/2006, 21:38
Ostras, ahora no tengo mucho tiempo de responder.

Gracias por probarlo, pero a mí se me sigue quedando en pantalla negra. Y otra cosa, sí que uso SDL_LockSurface y la de desbloquear, en la función Draw de ParticleSystemDemo.cpp.

Respecto a lo de tener que usar HW_SURFACE en lugar de SW_SURFACE, ya lo sabía, lo que pasa es que como mi versión no estaba acelerada, tuve que dejar el segundo.

Pero en Particle::Render y Cursor::Render no bloqueabas la surface, he añadido el SDL_LockSurface/SDL_UnlockSurface ahí y con eso ha funcionado :)

efegea
14/01/2006, 21:40
efegea, ¿no te da ningún problema?, ¿solo has cambiado el SWSURFACE por HWSURFACE?

Yo tengo hecho un ejemplo y, aunque con la aceleración va el doble de rápido que sin ella, la pantalla parpadea de la hostia y no se porque puede ser...

En el sistema de particulas de miq01 no parpadea, pero en el SMSPlus si que lo hace, y es demasiado molesto como para ser jugable. Quizás tenga algun fallo estas SDL aceleradas a la hora de hacer el blit

miq01
14/01/2006, 21:56
Pero en Particle::Render y Cursor::Render no bloqueabas la surface, he añadido el SDL_LockSurface/SDL_UnlockSurface ahí y con eso ha funcionado :)
Cierto que en esas funciones no bloqueo y desbloqueo, pero sí lo hago fuera, en Draw:

void Draw()
{
if (SDL_MUSTLOCK(surface))
if (SDL_LockSurface(surface) < 0)
return;

// Background
SDL_FillRect(surface, NULL, bgColour);

// Particles
for (Uint16 i=0; i < NUM_PARTICLES; i++) particles[i]->Render(surface);

// Cursor
cursor->Render();

if (SDL_MUSTLOCK(surface))
SDL_UnlockSurface(surface);

SDL_Flip(surface);
}

Quiero decir que el Render de las partículas y el cursor están protegidos. ¿O no es suficiente?

A parte, me he descargado tu ejecutable y se sigue quedando frito... Ostras, no lo pillo... :(

Jan_Europa
14/01/2006, 22:12
Quizás tenga algun fallo estas SDL aceleradas a la hora de hacer el blit

creo recordar que en el hilo de gp32x del autor de las SDL estas comentaba
algo sobre ello, pero vamos, tampoco me hagais mucho caso que estoy resacoso :)