Dudas para mejorar rendimiento collision

Started by Arcontus, March 19, 2011, 10:29:16 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Arcontus

Buenas chicos,

tengo varias dudas sobre collision:

Dado una ventana (GUI) con con 10 botones, ¿Que es más optimo?
opcion a: Que cada boton calcule un collision con respecto a mouse.
opcion b: Que se calcule un collision de la ventana, si da afirmativo, entonces se calcule un collision de los botones.
Personalmente pienso que la opción B debería ser más rápida, pero no estoy seguro ya que la ventana es de mayor tamaño.


Dadas naves y disparos, donde hay un número superior a 50 procesos de ambos tipos...:
opcion a: Cada nave realiza un collision con los disparos para actuar en consecuencia.
opcion b: Se hace primero un collision_box y si da afirmativo, entonces hacemos el collision para asegurar el impacto.

Saludos!
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

Windgate

En el primer caso la B me parece buena idea, no lo había pensado pero sí, ahorraría comprobaciones :D

En el segundo caso te recomiendo que hagas la prueba con 100 procesos de cada y calcules el FPS medio obtenido para A y para B en una ejecución de 1 minuto. Por supuesto haznos saber resultados :D
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

no se a quien se lo he dicho o si lo he dicho aqui, pero cuantas menos procesos hagan colisiones mayor rendimiento se obtendra.

en el caso del mouse, puede no llegar a ser necesario usar collision si se quiere buscar rendimiento, porque el mouse solo collisiona con las coordenadas x e y del mismo, no contra su grafico.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

Para lo de las ventanas y botones, supongo que tendrás la ventana activa, así que lo primero sería saber si la ventana del botón está activa. Después de eso, es mejor usar coordenadas para averiguar si el ratón colisiona o no con el botón (si el punto de control está en el centro del botón, la fórmula:

abs(mouse.x-x)<mitad_ancho

es muy útil).

En el caso de los cientos de procesos, la última vez lo resolví:
-1º Comprobando, mediante coordenadas, si algún disparo estaba "suficientemente cerca".
-2ª Si estaba suficientemente cerca, llamar a collision.
En ocasiones conviene sacrificar precisión en favor del rendimiento, suponiendo un area de colisión cuadrada (de nuevo, mediante la diferencia de coordenadas, o usando collision_box) o circular (collision_circle). En NES siempre fue cuadrada.

Aunque este tema de optimización también depende de la máquina destino: en PC ni siquiera merece la pena el esfuerzo, a menos que éste tenga más de 10 años, pero en WIZ sí que hay que apurar todo lo posible.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Arcontus

Quote from: Windgate on March 19, 2011, 10:49:46 AM
En el primer caso la B me parece buena idea, no lo había pensado pero sí, ahorraría comprobaciones :D

En el segundo caso te recomiendo que hagas la prueba con 100 procesos de cada y calcules el FPS medio obtenido para A y para B en una ejecución de 1 minuto. Por supuesto haznos saber resultados :D

Probé el tema de la siguiente manera:

if (collision_box(type disparo))
if (collision(type disparo))
...
END
END

y no funciona.

Si elimino el collision_box entonces funciona con normalidad, pero lo más curioso es que si dejo el collision_box y elimino el collision, entonces vuelve a no funcionar.
¿Puede ser que collision_box tenga algún problema con los procesos en scroll?

Saludos!
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

SplinterGU

podria pero no deberia, ya que lo probe bien... si pones un ejemplo donde falle te lo agradecere.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Arcontus

#6
Quote from: SplinterGU on June 04, 2011, 04:02:40 PM
podria pero no deberia, ya que lo probe bien... si pones un ejemplo donde falle te lo agradecere.

Splinter, fallo mio como sospechaba. El collision_box funciona correctamente en mis pruebas, pero ayer no localizaba el error.

El sistema de ahorro queda de la siguiente manera:

int impacto;
...
if (impacto = collision_box(type disparo))
if (collision(impacto))
...
END
END

Y tras las pruebas y ejecutarlo 4 veces cada sistema estos son los resultados:
85 procesos solo con collision_box = 84-85FPS
85 procesos con el método anterior descrito = 79-83FPS
85 procesos solo con collision = 78-81FPS
240 procesos solo con collision_box = 66-68FPS
240 procesos con el método anterior descrito = 51-52FPS.
240 procesos solo con collision = 49-50FPS


Como veis, se observa más diferencia en casos extremos, en situaciones normales es poco el ahorro a excepción de solo collision_box, pero entre usar solo collision o verificar previamente con collision_box en mis pruebas parece que algo si ahorra.

Viendo esto me sale la siguiente pregunta/Sugerencia: Splinter, ¿No sería algo más optimo incluir una comprobación tipo collision_box dentro de la llamada a collision?

Un saludo.
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

SplinterGU

de hecho lo tiene, algo similar, lo que sucede es que una vez que detecta que las areas collisionan, hace una comprobacion a nivel de pixel.
de cuanto tiempo sostenido fueron tus pruebas? siempre usando los mismos valores de procesos y posicionamiento?
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Arcontus

Quote from: SplinterGU on June 05, 2011, 04:18:41 PM
de hecho lo tiene, algo similar, lo que sucede es que una vez que detecta que las areas collisionan, hace una comprobacion a nivel de pixel.
de cuanto tiempo sostenido fueron tus pruebas? siempre usando los mismos valores de procesos y posicionamiento?

Las pruebas no son con todos los procesos en el mismo punto ni nada por el estilo y tampoco han sido demasiado rigurosas. Además según en el procesador que se ejecute cambia el rendimiento notablemente. Pero me ha parecido encontrar una ligerisima diferencia entre usar collision_box y pasarle el ID del proceso colisionado a collision que directamente collision.

Por como está programado mi proyecto, no puedo simular exactamente la misma prueba, tan solo hacer varias y apuntarme valores máximos y mínimos como he hecho.

Saludos!
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

SplinterGU

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

Arcontus

Quote from: SplinterGU on June 09, 2011, 07:11:50 PM
pasarle el ID sin dudas es mas rapido.

Entonces, por lo que entiendo, debería serte sencillo optimizar collision directamente para que internamente funcione apoyandose sobre collision_box, ¿correcto?.

Saludos!
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

SplinterGU

deberia revisarlo, tengo mis dudas si realmente es mas optimo...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Arcontus

5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com