Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: EMiner11 en Julio 23, 2018, 07:10:10 PM

Título: Memoria Agotada- Surface free no funciona.
Publicado por: EMiner11 en Julio 23, 2018, 07:10:10 PM
 :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!..
Título: Re:Memoria Agotada- Surface free no funciona.
Publicado por: BssString en Julio 23, 2018, 07:27:47 PM
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
Título: Re:Memoria Agotada- Surface free no funciona.
Publicado por: EMiner11 en Julio 26, 2018, 05:43:44 PM
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!!!...