Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: Marth en Mayo 14, 2022, 12:47:13 AM

Título: Optimizar creación de sprites [Solucionado]
Publicado por: Marth en Mayo 14, 2022, 12:47:13 AM
Verán, estoy desarrollando un editor de sprites, pero tengo un problema.
La cosa es que para ello tengo 2 matrices. Una para el color del pixel y otra para el alfa del pixel.
Con estas creo un sprite que llamaremos ima, que es lo que se muestra en pantalla.
Pero este es el código cuando quiero crear el sprite:
    var super=surface_create(ancho,alto)
    surface_set_target(super)
    draw_clear_alpha(0,0)
    for(var a=0; a<ancho; a++)
        for(var b=0; b<alto; b++){
            draw_set_alpha(alfa[a,b])
            draw_point_color(a,b,color[a,b])
        }
    draw_set_alpha(1)
    if(ima!=-1)
        sprite_delete(ima)
    ima=sprite_create_from_surface(super,0,0,ancho,alto,0,0,0,0)
    surface_reset_target()
    surface_free(super)

Este código es bastante lento. ¿Alguien sabe algo más eficiente para generar un sprite?
Título: Re: Optimizar creación de sprites
Publicado por: brunoxzx en Mayo 14, 2022, 01:20:59 AM
Sí, puedes usar un buffer, parecido al scrpt que usabas para cargar en tú otro post, pero acá escribes. Usa la función buffer_set_surface en lugar de get...

Otra opción puede ser un shader para cada brocha y que actualice una superficie, usas un uniform para introducir la posición del mouse, eso sería muy rápido, pero igual no tan versátil. Yo creo que con la otra opción ya debes tener suficiente rendimiento  ;).
Título: Re: Optimizar creación de sprites
Publicado por: Marth en Mayo 14, 2022, 01:34:01 AM
Cita de: brunoxzx en Mayo 14, 2022, 01:20:59 AM
Sí, puedes usar un buffer, parecido al scrpt que usabas para cargar en tú otro post, pero acá escribes. Usa la función buffer_set_surface en lugar de get...

Otra opción puede ser un shader para cada brocha y que actualice una superficie, usas un uniform para introducir la posición del mouse, eso sería muy rápido, pero igual no tan versátil. Yo creo que con la otra opción ya debes tener suficiente rendimiento  ;).

¿Y como haría eso, para ser más exacto?
Título: Re: Optimizar creación de sprites
Publicado por: Jeffrey Faper en Mayo 14, 2022, 02:41:02 AM
(En game maker 1 no tarda mucho) me retracto si tarda un chingo 6 minutos para una imagen de 4096x4096...
recuerdo que habia mucha informacion sobre estos temas para GM1 pero ya no existen las paginas
eso si todos los post coincidian en algo que GM1 es una mierda y en todos usaba usaban buffers
Título: Re: Optimizar creación de sprites
Publicado por: Marth en Mayo 14, 2022, 01:39:02 PM
Voy a dar un ejemplo. Imaginemos este código:

#macro ancho 640
#macro alto 480

for(var a=0; a<ancho; a++)
    for(var b=0; b<alto; b++){
        alfa[a,b]=random_range(0,1)
        color[a,b]=irandom(c_white)
   }


¿Como sería el código para convertir esta matriz en un sprite usando buffer_set_surface?
Título: Re: Optimizar creación de sprites
Publicado por: Jeffrey Faper en Mayo 14, 2022, 06:50:18 PM
Cita de: Marth en Mayo 14, 2022, 01:39:02 PM
Voy a dar un ejemplo. Imaginemos este código:

#macro ancho 640
#macro alto 480

for(var a=0; a<ancho; a++)
    for(var b=0; b<alto; b++){
        alfa[a,b]=random_range(0,1)
        color[a,b]=irandom(c_white)
   }


¿Como sería el código para convertir esta matriz en un sprite usando buffer_set_surface?
La verdad jamas he usado buffers para dibujar o guardar imagenes. pero esto fue lo poco que encontre

Guardar surface en un bufer: https://forum.yoyogames.com/index.php?threads/saving-surface-to-a-buffer.30592/
Convertir bufer a textura,sprite o surface : https://forum.yoyogames.com/index.php?threads/is-there-a-way-to-convert-the-buffer-to-a-texture-or-a-sprite-or-surface.33081/
GM 1.4 WebM Player : https://www.smwcentral.net/?p=viewthread&t=118677&page=1&pid=1585487
Título: Re: Optimizar creación de sprites
Publicado por: eduardo960 en Mayo 14, 2022, 08:12:29 PM
[gml]
#macro ANCHO 640
#macro ALTO 480

var buff = buffer_create((ANCHO * ALTO) * 4, buffer_fixed, 1);
buffer_seek(buff, buffer_seek_start, 0);
for(var b = 0; b < ALTO; b ++)
{
    for(var a = 0; a < ANCHO; a ++)
   {
      alfa[a, b] = irandom_range(0, 255);
        color[a, b] = irandom(c_white);
      buffer_write(buff, buffer_u8, color_get_red(color[a, b]));
      buffer_write(buff, buffer_u8, color_get_green(color[a, b]));
      buffer_write(buff, buffer_u8, color_get_blue(color[a, b]));
      buffer_write(buff, buffer_u8, alfa[a, b]);
   }
}

s = surface_create(ANCHO, ALTO);
buffer_set_surface(buff, s, 0);
[/gml]
Título: Re: Optimizar creación de sprites
Publicado por: Marth en Mayo 15, 2022, 01:51:47 AM
Cita de: eduardo960 en Mayo 14, 2022, 08:12:29 PM
[gml]
#macro ANCHO 640
#macro ALTO 480

var buff = buffer_create((ANCHO * ALTO) * 4, buffer_fixed, 1);
buffer_seek(buff, buffer_seek_start, 0);
for(var b = 0; b < ALTO; b ++)
{
    for(var a = 0; a < ANCHO; a ++)
   {
      alfa[a, b] = irandom_range(0, 255);
        color[a, b] = irandom(c_white);
      buffer_write(buff, buffer_u8, color_get_red(color[a, b]));
      buffer_write(buff, buffer_u8, color_get_green(color[a, b]));
      buffer_write(buff, buffer_u8, color_get_blue(color[a, b]));
      buffer_write(buff, buffer_u8, alfa[a, b]);
   }
}

s = surface_create(ANCHO, ALTO);
buffer_set_surface(buff, s, 0);
[/gml]

Vale, esto sí que funciona.