Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: Mgbu en Octubre 11, 2012, 08:50:03 PM

Título: collision_rectangle vs collision_circle
Publicado por: Mgbu en Octubre 11, 2012, 08:50:03 PM
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?
Título: Re:collision_rectangle vs collision_circle
Publicado por: ferhand en Octubre 11, 2012, 09:22:28 PM
   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
Título: Re:collision_rectangle vs collision_circle
Publicado por: Texic en Octubre 11, 2012, 09:37:53 PM
A este tema le falta algo... Me pregunto qué puede ser.... Alguna idea Mgbu?
Título: Re:collision_rectangle vs collision_circle
Publicado por: Mgbu en Octubre 11, 2012, 10:46:35 PM
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
Título: Re:collision_rectangle vs collision_circle
Publicado por: Zeit en Octubre 16, 2012, 04:22:14 PM
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.
Título: Re:collision_rectangle vs collision_circle
Publicado por: 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
Título: Re:collision_rectangle vs collision_circle
Publicado por: ferhand en Octubre 16, 2012, 09:19:01 PM
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)
Título: Re:collision_rectangle vs collision_circle
Publicado por: Mgbu en Octubre 16, 2012, 09:31:37 PM
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
Título: Re:collision_rectangle vs collision_circle
Publicado por: Zeit en Octubre 16, 2012, 11:40:39 PM
Tiene razon ferhand, prueba metiendo mas objetos y comentas, saludos.
Título: Re:collision_rectangle vs collision_circle
Publicado por: Mgbu en Octubre 17, 2012, 12:19:44 AM
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
Título: Re:collision_rectangle vs collision_circle
Publicado por: Zeit en Octubre 17, 2012, 05:29:48 PM
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.
Título: Re:collision_rectangle vs collision_circle
Publicado por: Mgbu en Octubre 17, 2012, 06:53:37 PM
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