Noticias

Se ha publicado un nuevo servicio, el Portal de Juegos Online

* Sponsor

Comunidad Game Maker

Bienvenid@ a la comunidad hispana de Game Maker. Nuestro objetivo es crear videojuegos y dar soporte en castellano de GM. Para mejorar nuestro servicio hemos implantado, como adicion al reglamento general, algunas normas especificas en los subforos más comunes. ¡No olvides informarte antes de participar!.

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - DarkKRuleR

Páginas: 1 2 3 ... 48
1
¡Buenas! Pues tengo un vertex_buffer vacío. Cada vez que le doy a un botón, lo reseteo (vertex_delete_buffer) y creo uno nuevo con 1 elemento. Al volver a pulsar el botón, lo vuelvo a borrar y creo otro vertex buffer con 2 elementos... Cada vez voy haciendo el vertex más grande. Cada vez que pulso el botón se laguea un poco, y es normal, porque consume en crearlo. Pero una vez creado el vertex buffer gigante... Cada step lo único que hago es un vertex_submit. Y laguea un montón. Incluso si no dibujo el vertex y no vuelvo a crearlo ni referenciarlo, cada step laguea un montón, como si... la sola existencia del vertex provocara que cada step el garbage collector se volviera loco, aunque no esté creándolo, destruyéndolo ni dibujándolo...



Tiene muchos elementos, hay que decirlo. Cada vez que añado un elemento, son 50 cubos, y cada cubo tiene sus vértices. Pero con sólo crear 5 ya se dispara así de loco. Y se supone que una vez creado el buffer, éste no debería consumir ni el garbage collector debería volverse loco, no estoy haciendo nada con él, literalmente... ¿Qué se me escapa?

El código para crear el vertex es:

function getVertexMegaCorrupcion() {
        var _ver = vertex_create_buffer();
        vertex_begin(_ver,oControl.vertexFormat);

        for (var i = 0; i < instance_number(oCorrupcion); ++i) {
            var _cor = instance_find(oCorrupcion,i);
            repeat 50 {
                var _phi = choose(0,90), _theta = choose(0,90);
                var _dir = random(360), _lon = random(25);
                var _xMas = _lon*dcos(_dir), _yMas = -_lon*dsin(_dir);
// Script que hace una secuencia de vértices (vertex_position_3d, vertex_colour, vertex_texcoord)
            }
        }
        vertex_end(_ver);
        return _ver;
    }

Sí, es un poco grande, es lo que llamo un megamodelo, mega vertex buffer. Un vertex agrupando muchos objetos para hacer 1 solo draw (vertex_submit). Pero en el pasado hice cosas peores y más grandes... Y con sólo 2 -3 objetos ya comienza el garbage collector a volverse loco!

EDIT: Si borro el vertex con vertex_delete_buffer y lo reconstruyo, el garbage se vuelve más y más loco con cada reconstrucción... aunque el número de oCorrupcion no cambia, así que debería re-crearlo con el mismo tamaño. Algo hago mal...

2
Preguntas y respuestas / [Resuelto] Orden de dibujo en 3D para GMS2
« en: Agosto 11, 2021, 02:09:19 pm »
¡Buenas! Pues usando el 3D en GMS1.4, con activar el zwrite ya era automático. Da igual en qué orden dibujo cosas en 3D, las que están más cerca de la cámara se dibujan por encima de las que están lejos. Esto no parece funcionar del todo bien en GMS2... Me ocurren casos donde no aplica. Tengo esto en create. Lo raro es que funciona para algunos triángulos pero para otros no.

gpu_set_alphatestenable(true);
gpu_set_zwriteenable(true);
gpu_set_ztestenable(true);

Aquí el ejemplo



Un tubo rojo y otro blanco, ambos salen de una esfera amarilla. Podemos ver que si miramos desde la derecha, el tubo rojo está más cerca de la cámara y se ve por encima del blanco, y si miramos por la izquierda, el tubo blanco está más cerca de la cámara y se ve por encima del rojo. TODO BIEN. Pero esa esfera amarilla es gigante y debería estar por encima de AMBOS TUBOS, cubriéndolos. ¿Por qué no aplica a la esfera?

RESUELTO, estaba definiendo los triángulos en el orden incorrecto para la esfera

3
¡Buenas! Esto es mu raro... tengo una surface con color plano de fondo y, cada vez que dibujo un sprite semitransparente, éste deja un "agujero" que me permite ver a través de la surface... ¿Alguna idea? >_<

if (!surface_exists(sur)) sur = surface_create(size, size);
if (surface_exists(sur)) surface_set_target(sur);
draw_clear_alpha(c_black, 0);
draw_set_blend_mode(bm_normal);
draw_sprite_ext(iconoDeColorOpacoRojoOscuro, 34, 256, 256, 8, 8, 0, c_white, 1);

draw_sprite_ext(manchaBlancaConTransparencias, 0, xMancha[i], yMancha[i], size, size, 0, colMancha[i], alphaMancha[i]);
 
surface_reset_target();
   
if (surface_exists(sur)) txEstrella = surface_get_texture(surEstrella);

EDIT: Resuelto con bm_add, el efecto me gusta.

4
¡Buenas! ¿Alguien conoce cuál es la implementación de d3d_model_block y similares? Como no tiene coordenadas de textura, alpha ni color, tuve que crearme uno personalizado, y pos tiro de d3d_model_primitive_begin y d3d_model_vertex_texture_colour, y me va perfecto. Pero noto que el juego ralentiza bastante. Lo que gano en eficiencia de poder tener 300 cubos en 1 solo modelo y 1 sola llamada a draw, lo pierdo en tener que definir los vértices de cada una en cada step (modelo dinámico que debo redefinir en cada step).

¿Sabéis si d3d_model_block también hace esto, o si hace algo como "precargar" el modelo e insertarlo? ¿Es posible hacer (emularlo) en caso de que exista eso, definir los vértices del modelo en otro lado e "insertarlo"/"fusionarlo" al modelo actual? Si tengo que hacer 300 draw_block, volvería de nuevo a ralentizar todo...

5
Juegos completos / Re:Adiós, capitán.
« en: Diciembre 31, 2020, 05:34:50 pm »
Grande, Dixon.

6
Preguntas y respuestas / Re:como puedo hacer un sistema de misiones
« en: Noviembre 08, 2020, 09:38:08 pm »
Manéjate con variables. En un objeto principal ten una variable por cada misión, cuyo valor inicial podría ser -1, que significa "no disponible". En el momento en que te dan la misión, puedes ponerlo a 0, indicando que la comenzaste. Asímismo podrías chequear que el NPC o lo que sea sólo te de la misión si su variable vale -1, para no repetir. Entonces, de 0 hacia arriba son los estados. Por ejemplo, mision: caza al gato, vale 0. Al atrapar el gato, pones la variable = 1, que significará "devuelve el gato al dueño". Al llegar al dueño, si la variable vale 1, descubres que en realidad el dueño es el gato y el gato es el dueño, entonces la pones = 2. Etc etc. Chequeando el valor de las variables puedes tener el flujo. Y por ejemplo, esta mision al acabar, la pongo = 7 (si tuvo 7 pasos) y entonces ya aparece como completada (cada mision tendria su propio numero para salir como completada).

7
Preguntas y respuestas / Fatal error in Vertex Shader Compilation
« en: Noviembre 02, 2020, 06:34:43 pm »
Así sin más, sin menos. Le explotó en la cara en el PC de algunos amigos. Es raro porque en el pasado ya les funcionó lo mismo en esos mismos PCs, y no veo que haya añadido nada nuevo para que ocurra... Al resto nos va bien.


8
Preguntas y respuestas / Re:Orden triángulos en modelo 3D
« en: Octubre 08, 2020, 08:52:57 pm »
Si te fijas, en la imagen, la cara inferior de la mesa es la frontal, y en las patas, sus caras también son frontales. Ocurre que si en el modelo está definida primero la cara FRONTAL de la pata, y luego la cara FRONTAL de la mesa, pero lo miras desde abajo, entonces la cara FRONTAL de la mesa se superpone a la cara FRONTAL de la pata

Con modelos que son parecidos a cuadrados o redondos no ocurre

Y sí, siempre tengo el culling activado

EDIT: d3d_set_zwriteenable lo resuelve automáticamente... siempre pensé que no servía para nada la función xDDD Resuelto!

9
Preguntas y respuestas / Re:Orden triángulos en modelo 3D
« en: Octubre 08, 2020, 06:47:55 pm »
Ya tengo el culling activado. Pondré un ejemplo gráfico, culpa mía.



Si, por ejemplo, defines el modelo de la mesa primero las patas y luego la tabla, al dibujar la tabla al final, se dibujará superpuesta a las patas. Bien. Pero al mirar la mesa desde abajo, la tabla se seguirá superponiendo a las patas, pues así fue definido el modelo en el orden de sus triángulos, y se verá mal. No depende del culling.

Cada modelo se verá mal de 300 formas distintas segun desde dónde lo mires, y no se me ocurre cómo arreglan esto los que hacen juegos...

10
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:
shader_set(tu_shader_aqui)
//tus draw events aqui
shader_reset()

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!

11
Preguntas y respuestas / Re:Orden triángulos en modelo 3D
« en: Octubre 08, 2020, 06:11:12 pm »
Hola DarkKRuleR

Mejor crear el objeto (como triángulo) en un programa externo (como Blender que es gratuito) e importar el .OBJ o no?
y la textura en .PNG

Saludos

Crearlo en un programa externo no cambiaría nada. El orden de los triángulos definidos en el modelo sería fijo y ocurriría ese problema al verlos desde el lado contrario, no?

12
Preguntas y respuestas / [Resuelto] Orden triángulos en modelo 3D
« en: Octubre 08, 2020, 02:17:31 am »
¡Buenas! La duda, la duda... ¿Cómo lo hace la gente en el mundo y todos los juegos para no tener problemas con el orden de los triángulos en un modelo 3D? Imaginad un caso simple, una mesa. Si dibujo primero las patas y luego la tabla, se ve bien mirando desde arriba, pero si miro desde abajo... Al principio mis modelos eran simples pero... a la mínima complejidad, el modelo peta si lo miras desde otro lado. No se me ocurre nada que sea... viable. ¿Cómo le hacen en los demás juegos? Gracias.

13
Juegos completos / Re:El pan de nuestra familia
« en: Septiembre 26, 2020, 03:39:07 am »
Hermoso. Una forma curiosa de mostrar la realidad que uno vive al mundo.

14
¡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.

15
Preguntas y respuestas / Re:Cámara 3D que no atraviese sólidos.
« en: Agosto 19, 2020, 03:34:51 pm »
Graciass. En principio no planteé collision_line ya que al ser full 3D pues faltaba la tercera componente. Sin embargo vi que de alguna forma podía hacerse, aunque fue complicado.

Entre pruebas y pruebas di con una solucion alternativa. La original, con un pequeño retoque xD Gracias igual por ser esa chispa (!)

Páginas: 1 2 3 ... 48

Warning: Parameter 1 to spoiler_buffer() expected to be a reference, value given in Unknown on line 0

Warning: Parameter 1 to custom_report_ob() expected to be a reference, value given in Unknown on line 0