[Pruebas] draw_sprite vs tiles vs draw_surface

OP

Khyze

Muchos merecen morir!
Colaborador
Mensajes
4.406
Calificaciones
2K 22
Puntos
325
Ubicación
Patria, patria, patria querida!
#1
>>>>>>----------------------------------Inicio de relleno/Motivo de la prueba:
Otra prueba de rendimiento, para quien sepa, he subido varios "juegos" cortos, digo asi por que son solamente partes de ellos, principalmente hacia algunas mecanicas y las queria compartir, hace un tiempo me habia decidido por dejar de hacer eso por que considere que no podia aprender mas haciendo eso (Era repetir, repetir y repetir), lo que significa que ya tengo la capacidad que queria con GML, la suficiente para terminar las cosas (Claro, pasando por el aburrimiento de hacer el arte, tengo uno con puros cuadros de colores, me llama la atencion xD)

Ok, dicho eso, uno de los proyectos es un fangame llamado "Digimon League", el mas "grande" por asi decirlo, ya que parte de el consta en explorar zonas (Grandes mapas seria lo mejor que se me ocurre), y claramente es algo que no he hecho antes, a pesar de que se como hacerlo de una manera, se que existen otras maneras, muchas personas en el foro oficial de yoyogames hablan sin pruebas, al punto donde existen usuarios que te dicen que utilizar instancias y usando el deactivate es bueno para los mapas (No, no lo es, esa funcion es una de las peores xD, al menos hasta donde lo he pensado y utilizado)

Hace años (O el pasado) mencione que trabajaba en una copia de Rpg Maker para Game Maker (Por que? para que? pues, mas libertad segun yo), decidi comenzar con el mapeo en tiempo real (El que pienso incorporar a Digimon League, no tiene luchas, inventario ni nada, solo lo mejor que pude hacer en cuanto al sistema de mapeo), paso por muchos cambios, siendo el ultimo el de utilizar surfaces, el problema es que desconozco como funcionan y por eso me da "miedo", sin mencionar que existe un limite en su tamaño (No lo he tocado con surfaces)

Puede que no sea la mejor manera de hacerlo, pero es la unica manera que se me ocurrio, vi un video de Guinxu (Guisalgom aqui) y hablaba sobre como hicieron que los juegos de nes, snes y gb fueran tan ligeros, quizas exista una pista alli (Sin mencionar su bajo consumo de recursos, se que la resolucion y el numero de casillas en mapa tiene mucho que ver comparandolo con lo de ahora)
>>>>>>-----------------------------------Final de relleno/Motivo de la prueba:

Las pruebas las realize esta vez en dos computadores distintos, la misma de antes y la canaima (Laptop que regala el gobierno), por que esta vez creo que la tarjeta de video entra en juego...

Estas tendran el siguiente formato:
-Base: Los fps_real sin hacer absolutamente nada

-Loop: Cantidad de repeticiones de tiles (Revisar el codigo al final para hacerse una idea)
-Draw: Los fps_real al dibujar mediante "draw_sprite"
-Tiles: Los fps_real al dibujar mediante tiles (Agregados por code)
-Surface: Los fps_real al dibujar mediante "draw_surface", para crearlas se utilizó "draw_sprite"

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Intel(R) Pentium(R) CPU 630 @ 2.70GHz 2.70GHz
8,00GB (7,70GB utilizable)
Nvidia GeForce 210
>>>>>>>>>>>>
-Base: 1900-2100

-Loop 100
-Draw: 1300-1400
-Tiles: 1700-2000
-Surface: 1900-2100

-Loop 1120
-Draw: 560-575
-Tiles: 1520-1560
-Surface: 1900-2100

-Loop 2000
-Draw: 360-370
-Tiles: 1450-1500
-Surface: 1900-2100

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Intel(R) Celeron(R) CPU 847 @ 1.10GHz 1.10GHz
2,00GB (1,83GB utilizable)
>>>>>>>>>>>>>>>>
-Base: 745-760

-Loop 100
-Draw: 590-620
-Tiles: 680-700

-Loop 1120
-Draw: 240-260
-Tiles: 580-620

-Loop 2000
-Draw: 160-170
-Tiles: 550-590

Aqui no puse surfaces por que la probe luego y note que igual los fps quedaban como en base

Estas pruebas quizas no sean las mejores, las hice de manera muy vaga al parecer, la room_speed es de 60 y el tamaño de pantalla es 640x480, solo medi su existencia como tal, no el coste de su creacion, quizas edite luego con mejores resultados (Pero primero quiero oir sugerencias de que usar)

____________________________________________________________________________
-RESULTADOS!!!<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<!
____________________________________________________________________________
-Claramente "draw_sprite" es lo peor que puedas utilizar, es el que posee peor rendimiento y mientras "mas grande" sea "el mapa" su lentitud incrementara notablemente, eso si no sabes lo que haces, lo que no debes olvidar es que es de los mas sencillos de utilizar, al punto donde facilmente puedes dibujar lo que se nota en pantalla con un simple loop utilizando las coordenadas "x" & "y" de la "camara" (O personaje)

-Los tiles por otro lado el rendimiento es aceptable, mientras mas grande el mapa, su consumo no incrementa tanto como el "draw_sprite", de estos desgraciadamente no se mucho, siempre los "odie" sin motivo alguno, me sorprendio notar que supera al "draw_sprite" de manera sencilla, no requiere ese "extra" del "draw_sprite"

-Las surfaces en las pruebas mostraron ser la mejor opcion (Aparentan ser la manera "perfecta" y correcta), pero por alguna razon no me convence, su uso en este caso consta de el mismo "draw_sprite", la diferencia es que estos son guardados y almacenados en una "imagen grande", de manera que no requiere coordenadas, tamaños ni colores de los "tiles" despues de su creacion, en caso de que quieras modificarla luego de haberla almacenado, el rendimiento sera el de el "draw_sprite" por un step, ya que se eliminara y tendra que ser creada y almacenada nuevamente, pero luego se dibujara como una sin necesidad de loops

____________________________________________________________________________
-CODIGO!!!<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<!
____________________________________________________________________________

Create Event
Código:
cfps=0;
nfps=0;
loop=1120;
Draw Event
Código:
if keyboard_check_pressed(vk_escape) game_end();

//Draw Loop
if keyboard_check(vk_control)
{
    v=0; v2=0; repeat(loop)
    {
        draw_sprite(sprite0,0,32*v,32*v2);
        v+=1; if v>=20 {v=0; v2+=1;}
    }
}

//Tiles
if keyboard_check_pressed(vk_space)
{
    v=0; v2=0; repeat(loop)
    {
        tile_add(background0,0,0,32,32,32*v,32*v2,0);
        v+=1; if v>=20 {v=0; v2+=1;}
    }
}

if keyboard_check_released(vk_space)
{
    v=0; v2=0; repeat(loop)
    {
        var tile;
        tile = tile_layer_find(0,32*v,32*v2);
        if tile_exists(tile) tile_delete(tile);
        v+=1; if v>=20 {v=0; v2+=1;}
    }
}

//Surface
if keyboard_check_pressed(vk_shift)
{
    v=0; v2=0; repeat(loop)
    {
        v+=1; if v>=20 {v=0; v2+=1;}
    }
 
    s=surface_create(32*20,32*v2);
    surface_set_target(s);
    v=0; v2=0; repeat(loop)
    {
        draw_sprite(sprite0,0,32*v,32*v2);
        v+=1; if v>=20 {v=0; v2+=1;}
    }
    surface_reset_target();
}

if keyboard_check_released(vk_shift)
{
    if surface_exists(s) surface_free(s);
}

if keyboard_check(vk_shift) draw_surface(s,0,0);

//Debug, mostrar Fps
nfps+=1;
if nfps=30
{
    nfps=0;
    cfps=fps_real;
}

draw_text(view_xview+16,view_yview+16,string(fps)+string(" / ")+string(cfps));
draw_text(view_xview+16,view_yview+32,string(loop)+string(" Izquierda y Derecha para modificar"));

if !keyboard_check(vk_control) and !keyboard_check(vk_space)
{
    if keyboard_check(vk_left) if loop>=0 loop-=5;
    if keyboard_check(vk_right) loop+=5;
}
____________________________________________________________________________
-MIS PREGUNTAS!!!<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<!
____________________________________________________________________________

-Han utilizado estas en algun proyecto grande? de ser asi, cual utilizaron? les fue bien? (En cuanto a dibujado de mapas, obvio usaran el draw_sprite para cualquier cosa)

-Saben algo respecto a su funcionamiento? (Crei que los Tiles eran como las Surfaces, pero su consumo prueba lo contrario)

-La tarjeta de video influye mucho en esto?



Mi mentalidad es realizar cosas que puedan ser utilizadas por todos (Low-end, tostadoras, basuras, etc) por eso siempre pienso en la manera mas optima de hacer las cosas, nunca la mas rapida ni la primera que se me ocurra (Hay exepciones, pero si es cosa "libre" siempre seguire esos principios), en realidad las surfaces son muy "perfectas", me cuesta aceptarlo, me gustaria saber sus opiniones :D
 
Última edición:
Mensajes
365
Calificaciones
149 1
Puntos
60
#2
¡Excelentes benchmarks! Muy técnicos, solo sueles escuchar de estas cosas de los desarrolladores del GM. Es la clase de esfuerzo que esperaba de otros fan-games cuando usaba mi vieja laptop.

¿Has escuchado de un juego de Mario que hacia crossover con otros personajes? Se llama Mushroom Kingdom Fusion. El juego estaba tan poco optimizado que se jugaba entre 10 a 20 fps :'v (40-60 si el nivel era pequeño); u otro juego que salió de aquí de EMD llamado Yopsi o algo así, que se jugaba mucho peor xD (niveles demasiado grandes con muchas instancias, estas de seguro con miles de ifs y loops, y cientos de partículas creadas fuera de la pantalla). Por cierto deberías probar las partículas, por lo que he leído es la funcionalidad de GM que más depende de la GPU que del CPU, las surfaces también usan el GPU pero generan más llamadas de parte del CPU.