Julio 23, 2018, 07:10:10 PM Ultima modificación: Julio 23, 2018, 07:20:15 PM por EMiner11
 :GMS:

Estoy utilizando surfaces en este proyecto, no se que es lo que ocurre, cuando corro el programa todo va de maravilla los primeros segundos, pero luego se ralentiza y termina dando: "Out of Memory".Utilizo el "surface free" y aun asi parece seguir dando problema...

Este código va en el único objeto del juego, de los cuales solo tengo 2 instancias en el cuarto...

//Evento Create

xfinal = 640
yfinal = 0

n_puntos = 15 //numero de puntos intermedios...
desviacion = 70 //desviacion desde la linea central...
grosor = 25
color = c_blue
grosor_linea = 2

regularizacion = false

distancia = distance_to_point(xfinal,yfinal)
direccion = point_direction(x,y,xfinal,yfinal)

retardo = 0
max_retardo = 1

xpuntos = ds_list_create()
ypuntos = ds_list_create()


//Evento Draw

//Creamos la lista de puntos intermedios...

xfinal = mouse_x
yfinal = mouse_y

distancia = point_distance(x,y,xfinal,yfinal)
direccion = point_direction(x,y,xfinal,yfinal)

n_puntos = random_range(10,24)

    ds_list_destroy(xpuntos)
    ds_list_destroy(ypuntos)
   
    superficie = surface_create(distancia,(grosor+desviacion)*2)
    xpuntos = ds_list_create()
    ypuntos = ds_list_create()
   
    xpactual = 0
    ypactual = desviacion + grosor
   
    draw_set_colour(c_white)
   
    surface_set_target(superficie)
    draw_clear_alpha(c_black,0)
    draw_set_blend_mode(bm_max)
   
    for (i=0; i<n_puntos; i+=1){
        //añadimos los siguientes puntos al rayo...
        ds_list_add(xpuntos, random_range(i*(distancia/n_puntos),(i+1)*(distancia/n_puntos)))
        ds_list_add(ypuntos, random_range(grosor,(desviacion*2)-grosor))
        //dibujamos en la surface un segmento del rayo...
        draw_sprite_ext(spr_lineray,0,xpactual,ypactual,point_distance(xpactual,ypactual,ds_list_find_value(xpuntos,i),ds_list_find_value(ypuntos,i))/32,grosor/32,point_direction(xpactual,ypactual,ds_list_find_value(xpuntos,i),ds_list_find_value(ypuntos,i)),color,1)
        draw_sprite_ext(spr_circleray,0,ds_list_find_value(xpuntos,i),ds_list_find_value(ypuntos,i),grosor/32,grosor/32,0,color,1)
        draw_line_width(xpactual,ypactual,ds_list_find_value(xpuntos,i),ds_list_find_value(ypuntos,i),grosor_linea)
        //actualizamos...
        xpactual = ds_list_find_value(xpuntos,i)
        ypactual = ds_list_find_value(ypuntos,i)
        }
   
    //creamos el segmento final...
    draw_sprite_ext(spr_lineray,0,xpactual,ypactual,point_distance(xpactual,ypactual,distancia,desviacion+grosor)/32,grosor/32,point_direction(xpactual,ypactual,distancia,desviacion+grosor),color,1)
    draw_line_width(xpactual,ypactual,distancia-1,desviacion+grosor,grosor_linea)
   
    surface_reset_target()
    draw_set_blend_mode(bm_normal)

    spr_temp = sprite_create_from_surface(superficie,0,0,distancia-1,(grosor+desviacion)*2,false,false,0,grosor+desviacion)
    surface_free(superficie)


draw_sprite_ext(spr_temp,0,x,y,1,1,direccion,c_white,1)


AIUDA!..

Hola EMiner11

Al parecer lo que causa el consumo de memoria es la creación dinámica del sprite mediante la función "sprite_create_from_surface".

Te recomiendo usar sprite_delete(spr_temp) después de haber dibujado tu sprite en el draw event.

Saludos

Gracias por responder BssString...

Era justo lo que buscaba!!!...
Tenias razon, al parecer cada vez que creaba el sprite las texturas se acumulaban en la memoria...
Gracias!!!...