Hola, cuanto tiempo sin subir un tema XD

Bueno os cuento, estoy con un proyecto que me encantaría mostraros dentro de poco, pero estoy teniendo unos problemas de rendimiento, sobre todo con el Step.
Creo que se que lo puede causar, el juego puede llegar a tener 100 enemigos ejecutando este código en el Step:

if hp<=0 {
    global.monedas+=mon;
    global.xp+=xp;
    instance_destroy();
}

if push {
    x+=spd*global.mspd*4;
    sprite_index=spr_caminar;
    image_speed=0;
    exit;
}

if distance_to_object(instance_nearest(x,y,obj_Aliado))<=rango {
    enemigo=instance_nearest(x,y,obj_Aliado);
    if image_index<=1 {
        recargado=true;
    }
    if image_index>img_ataque {
        if image_index<img_ataque+.5 {
            if recargado {
                recargado=false;
                if instance_exists(enemigo) {
                    if enemigo.object_index=obj_Caseta_1 {
                        global.hp-=dmg;
                    } else {
                        enemigo.hp-=dmg;
                    }
                }
            }
        }
    }
    sprite_index=spr_atacar;
} else {
    sprite_index=spr_caminar;
    x-=spd*global.mspd;
}


Creo que eso puede causar el bajo rendimiento, alguna sugerencia para optimizar ese código? Estoy pensando en crear un obj_aliado_cercano, que en el step tenga esto:

enemigo[0]=instance_nearest(x,y,obj_Aliado);
enemigo[1]=enemigo[0].x;


Y en los enemigos cambiarles el step por:

if hp<=0 {
    global.monedas+=mon;
    global.xp+=xp;
    instance_destroy();
}

if push {
    x+=spd*global.mspd*4;
    sprite_index=spr_caminar;
    image_speed=0;
    exit;
}

if distance_to_point(obj_aliado_cercano.enemigo[1],y)<=rango {
    if image_index<=1 {
        recargado=true;
    }
    if image_index>img_ataque {
        if image_index<img_ataque+.5 {
            if recargado {
                recargado=false;
                if instance_exists(obj_aliado_cercano.enemigo[0]) {
                    if enemigo.object_index=obj_Caseta_1 {
                        global.hp-=dmg;
                    } else {
                        enemigo.hp-=dmg;
                    }
                }
            }
        }
    }
    sprite_index=spr_atacar;
} else {
    sprite_index=spr_caminar;
    x-=spd*global.mspd;
}


Pero no estoy seguro si cambiaría algo.

La funciones distance_to_object y distance_to_point son lentas porque miden la distancia desde el borde de las máscaras de colisión, es mejor usar point_distance para tomar en cuenta solo los orígenes de coordenadas, sin embargo, la distancia obtenida será un poco mayor que con con las funciones anteriores (porque en esas funciones se resta la distancia del origen al borde).

No es necesario crear un nuevo objeto, mejor solo agrega la variable antes de point_distance
[gml]
enemigo = instance_nearest(x,y,obj_Aliado);
if point_distance( enemigo.x, enemigo.y, x,y ) <= rango { //...
[/gml]

Lo anterior se podría optimizar agregando una variable que le indique a la instanca "enemigo" que no vuelva a ejecutar esa parte de código, porque el resultado ya se conoce con anticipación: la instancia más cercana es la misma que acaba de ejecutar el código.

También se podría cambiar el diseño de los niveles para evitar muchas instancias activas al mismo tiempo.

Bueno, me ha subido una media de 20 fps, lo que no es mucho, el juego va a una media de 300fps, segun el debug, y da bajones hasta los 90 fps, y suponiendo que el juego es para Android, es un rendimiento bastante bajo. Los otros dos datos que me da el debug(lo que está entre paréntesis suele estar en (40) (100) y va aumentando hasta aproximadamente (90) (200), que es cuando la oleada se acaba y se restaura.

Sera mejor el rendimiento en Game Maker Studio 2? Es que no se si merece la pena adquirirlo, a primera vista se ve bastante profesional y potente.