Loader

Shoutbox

Optimizar creación de sprites [Solucionado]

Publicado por Marth, Mayo 14, 2022, 12:47:13 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Mayo 14, 2022, 12:47:13 AM Ultima modificación: Mayo 15, 2022, 01:52:08 AM por Marth
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?

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  ;).

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?

Mayo 14, 2022, 02:41:02 AM #3 Ultima modificación: Mayo 14, 2022, 08:18:01 AM por Jeffrey Faper
(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

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?

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

[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]
W.I.P:            RaceBall, SceneChat, MMOPTG
Contacto:    Twitter, Facebook

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.

Powered by EzPortal