Septiembre 09, 2020, 10:08:37 PM Ultima modificación: Octubre 08, 2020, 06:48:16 PM por DarkKRuleR
¡Buenas! Os cuento el resumen. Yo tengo mis personajes. Defino las coordenadas de las partes del cuerpo y sus ángulos (hombro, codo, cintura, rodilla...), para tener la información de dónde dibujar el cuerpo y en qué pose. Entonces dibujo los sprites en esas coordenadas (el brazo, la mano, la pierna, el pie).

Qué pasa, que se ejecutan muchos draw_ .... y el coste se dispara bastante. He hecho comprobaciones y es como el 90% del coste de mi juego, sólo los personajes. Al parecer lo costoso no es la complejidad de qué dibujas, sino el hecho de llamar a las funciones de dibujo. Y como ejecuto muchos draw_ ... separados, pues consume mucha memoria.

¿Hay alguna forma de hacer esto más eficiente? Al ser el cuerpo dinámico, en principio no puedo hacer un modelo estático, pues si me muevo, las piernas se mueven, cambiando las coordenadas de sus vértices. ¿Alguna forma de dibujar todo esto sin tener el coste por llamar muchas veces a draw? ¿Alguna forma de, no sé, guardar todas esas coordenadas en una iteración, y luego dibujar todo de golpe, aunque sean coordenadas distintas en cada step?

EDIT: Justo he encontrado vertex_create_buffer y vertex_submit y demás, podría ser la solución... pero me cuesta entender.

Hola DarkKRuleR

Cada dibujo que haces, pasa por una Shader por defecto de Game Maker que hace ciertas correcciones "por si acaso" a lo que dibujas.
Puedes intentar evitar esa Shader para ver si eso tiene alguna mejora en el código o no.

Simplemente crea una nueva Shader, llámala como quieras y no le hagas ningún cambio, déjala tal como la genera Game Maker.
En el Draw_Event usas:
[gml]shader_set(tu_shader_aqui)
//tus draw events aqui
shader_reset()[/gml]

Eso hará que Game Maker en vez de usar la Default Shader, usará tu Shader que has generado que no tiene código.

Esa información se encuentra en este artículo:
https://help.yoyogames.com/hc/en-us/articles/216754868-Optimising-The-Draw-Pipeline

Otra cosa que puedes hacer es obviamente NO dibujar a los personajes que se encuentren fuera de cámara.

Saludos

Cita de: BssString en Octubre 08, 2020, 03:38:56 AM
Hola DarkKRuleR

Cada dibujo que haces, pasa por una Shader por defecto de Game Maker que hace ciertas correcciones "por si acaso" a lo que dibujas.
Puedes intentar evitar esa Shader para ver si eso tiene alguna mejora en el código o no.

Simplemente crea una nueva Shader, llámala como quieras y no le hagas ningún cambio, déjala tal como la genera Game Maker.
En el Draw_Event usas:
[gml]shader_set(tu_shader_aqui)
//tus draw events aqui
shader_reset()[/gml]

Eso hará que Game Maker en vez de usar la Default Shader, usará tu Shader que has generado que no tiene código.

Esa información se encuentra en este artículo:
https://help.yoyogames.com/hc/en-us/articles/216754868-Optimising-The-Draw-Pipeline

Otra cosa que puedes hacer es obviamente NO dibujar a los personajes que se encuentren fuera de cámara.

Saludos

Gracias por la respuesta. Al final lo resolví con aquello que encontré, vertex_buffers. Me permiten definir todas las llamadas al "draw", todos los triángulos, para ser enviados con una sola llamada al draw, siendo super eficiente. Y para modelos estáticos, uso modelos tal cual.

Lo que dices es un muy buen consejo que ya había leído anteriormente, pero lo hicimos de otra forma. Modificando el shader en las carpetas de window y quitando todas esas comprobaciones que dices, para que todos los juegos compilados no usen ese shader por defecto ineficiente!