Octubre 11, 2012, 08:50:03 PM Ultima modificación: Octubre 11, 2012, 10:44:24 PM por Mgbu
Como necesito usar collision_circle varias veces por step qería saber si había diferencia de  rendimiento con collision_rectangle ¿Vale la pena chequear con rectángulos en vez de círculos para no exigir la PC?
El Manual

- Ley de la gravitación selectiva: toda herramienta se caerá donde produzca el mayor daño.
- Si todo parece estar bien, es obvio que uno no encontró el problema
- Todo aquello que se corte a medida resultara ser demasiado corto.
- Todo archivo borrado era necesario, todo archivo conservado es inutil
- Cuando a usted se le ocurra la solución ideal, alguien habrá resuelto ya el problema.

                                                               Murphy


   Saludos Buen Amigo Mgbu:


    En teoria el chequeo de colision por rectangulo debe ser mas eficiente, pero estoy seguro que GM los gestiona de manera muy parecida por lo que no creo que haya grandes diferencias.  :-\

  De todas formas siempre propongo que los chequeos de colisones los getiones tu mismo creando una estructura propia que se ajuste a tus necesidades. Muchas veces es posible que GM realice chequeos extras que no son necesarios para el proyecto en si y pueden conllevar a una sobrecarga del mismo.  8)

  Un abrazo y nos hablamos...  ;D


A este tema le falta algo... Me pregunto qué puede ser.... Alguna idea Mgbu?




Oh dios, nunca voy a aprender :o

Pregunto porque para chequear un rectángulo es fácil, lo haces con coordenadas X e Y, pero con un círculo a lo mejor calculaba por píxel y podía hacer diferencias
El Manual

- Ley de la gravitación selectiva: toda herramienta se caerá donde produzca el mayor daño.
- Si todo parece estar bien, es obvio que uno no encontró el problema
- Todo aquello que se corte a medida resultara ser demasiado corto.
- Todo archivo borrado era necesario, todo archivo conservado es inutil
- Cuando a usted se le ocurra la solución ideal, alguien habrá resuelto ya el problema.

                                                               Murphy


#4 Octubre 16, 2012, 04:22:14 PM Ultima modificación: Octubre 16, 2012, 04:24:46 PM por Zeit
Hola, puedes hacer un programa que compare estas dos coliciones con un objeto, debes tener las siguentes variables ajustables, tipo de colicion (rectangular y circular), velocidad del room (steps por segundo, creo que es "speed"), entonces comparas el rendimiento si subes la velocidad usando el "administrador de tareas" y publicas tus resultados. Saludos.

EDIT: tambien puedes tener una tercer variables ajustable que indique el numero de chequeos por step.
Saludos Cordiales!!!

Tenés razón XD, los máximos FPS para estos códigos (de a uno) están al lado
repeat (10) {collision_rectangle(x,y,x+5,y+5,obj_otro,1,1)} //2240
repeat (10) {collision_ellipse(x,y,x+5,y+5,obj_otro,1,1)} //2220
repeat (10) {collision_circle(x,y,2,obj_otro,1,1)} //2230


Como se ve practicamente no hay diferencia
El Manual

- Ley de la gravitación selectiva: toda herramienta se caerá donde produzca el mayor daño.
- Si todo parece estar bien, es obvio que uno no encontró el problema
- Todo aquello que se corte a medida resultara ser demasiado corto.
- Todo archivo borrado era necesario, todo archivo conservado es inutil
- Cuando a usted se le ocurra la solución ideal, alguien habrá resuelto ya el problema.

                                                               Murphy


Cita de: Mgbu en Octubre 16, 2012, 07:04:31 PM
Tenés razón XD, los máximos FPS para estos códigos (de a uno) están al lado
repeat (10) {collision_rectangle(x,y,x+5,y+5,obj_otro,1,1)} //2240
repeat (10) {collision_ellipse(x,y,x+5,y+5,obj_otro,1,1)} //2220
repeat (10) {collision_circle(x,y,2,obj_otro,1,1)} //2230


Como se ve practicamente no hay diferencia

   Saludos hermano Mgbu:

  No hay diferencias si solo tienes un objeto en el "room".  :-[

  Trata de estresar al procesador colocando cien objetos que realicen esa función mas de diez veces por "steps" y entonces compara los resultados.   8)


Me parece que a la prueba la hice bien, mi forma de estresar el cpu fue obligarlo a correr el juego con room_speed de 5000. Y como ves llegó solo a 2200

Saludos!  ;D
El Manual

- Ley de la gravitación selectiva: toda herramienta se caerá donde produzca el mayor daño.
- Si todo parece estar bien, es obvio que uno no encontró el problema
- Todo aquello que se corte a medida resultara ser demasiado corto.
- Todo archivo borrado era necesario, todo archivo conservado es inutil
- Cuando a usted se le ocurra la solución ideal, alguien habrá resuelto ya el problema.

                                                               Murphy


Tiene razon ferhand, prueba metiendo mas objetos y comentas, saludos.
Saludos Cordiales!!!

Ustedes saben más que yo así que:... :-[

Probé dejando la room speed en 30 y usando estas lineas de una en una, y sigue siendo practicamente lo mismo
repeat (70000) {a=collision_rectangle(x,y,x+5,y+5,obj_otro,1,1)} //13fps 37%cpu
repeat (70000) {a=collision_ellipse(x,y,x+5,y+5,obj_otro,1,1)} //13fps 37%cpu
repeat (70000) {a=collision_circle(x,y,2,obj_otro,1,1)} //17fps 35%cpu


Cuando llegué a escribir esto me acordé que tebían que ser muchos objetos, entonces lo hice de nuevo XD

Puse 10 objetos que en step hacían esto, de a una linea por vez y comenté al lado lo que marcaba
repeat (10000) {a=collision_rectangle(x,y,x+5,y+5,obj_otro,1,1)} //10fps 36%cpu
repeat (10000) {a=collision_ellipse(x,y,x+5,y+5,obj_otro,1,1)} //9fps 36%cpu
repeat (10000) {a=collision_circle(x,y,2,obj_otro,1,1)} //12fps 36%cpu


Después había que probar con más objetos:

Al principio con este código creé 1000 objetos chequeadores:
repeat (1000) {instance_create(0,0,object0)}
Y a cada uno les fui haciendo chequear 50 veces por step:
repeat (50) {a=collision_rectangle(x,y,x+5,y+5,obj_otro,1,1)} //18fps 36%cpu
repeat (50) {a=collision_ellipse(x,y,x+5,y+5,obj_otro,1,1)} //18fps 37%cpu
repeat (50) {a=collision_circle(x,y,2,obj_otro,1,1)} //22fps 36%cpu


En definitiva estoy seguro de tres cosas:
- Con círculos parece más rápido
- Los valores de uso de CPU son inexactos porque se van cambiando a cada rato en la prueba
- Cada vez estoy más confundido XD

Destaco que el obj_otro estaba en la room moviendose hacia la derecha con un wrap_screen para que siempre esté en pantalla
El Manual

- Ley de la gravitación selectiva: toda herramienta se caerá donde produzca el mayor daño.
- Si todo parece estar bien, es obvio que uno no encontró el problema
- Todo aquello que se corte a medida resultara ser demasiado corto.
- Todo archivo borrado era necesario, todo archivo conservado es inutil
- Cuando a usted se le ocurra la solución ideal, alguien habrá resuelto ya el problema.

                                                               Murphy


#10 Octubre 17, 2012, 05:29:48 PM Ultima modificación: Octubre 17, 2012, 05:36:14 PM por Zeit
Por lo que veo el chequeo de colision es pixel por pixel dentro del area de la figura, y como el de menor area en tu ejemplo es el circulo por eso es mas eficiente, entonces si quieres el mas eficiente tienes que calcular el area de tu figura y tomar el de area menor, por ejemplo, un circulo con radio 2 cabe dentro del cuadrado 4x4 por lo que es mejor el circulo pero si el cuadrado es de 1x1 es mejor el cuadrado, saludos.
Saludos Cordiales!!!

Ahh, si, tenés razón, hice otra prueba, para ver si el argumento prec tenía que ver con el método de colisión, sorpresa, la velocidad del juego es la misma, no depende del argumento prec.

En definitiva usar cualquier forma es lo mismo, no hay casi diferencia, me quedo con el círculo XD
El Manual

- Ley de la gravitación selectiva: toda herramienta se caerá donde produzca el mayor daño.
- Si todo parece estar bien, es obvio que uno no encontró el problema
- Todo aquello que se corte a medida resultara ser demasiado corto.
- Todo archivo borrado era necesario, todo archivo conservado es inutil
- Cuando a usted se le ocurra la solución ideal, alguien habrá resuelto ya el problema.

                                                               Murphy