Noticias

Importante: ¡Si quieres publicar tu juego no olvides leer este tema!

* 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!.

Autor Tema: 3D Vertex_buffer dispara el uso del garbage collector aún sin utilizarse  (Leído 292 veces)

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

Desconectado DarkKRuleR

¡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...
« Última modificación: Septiembre 16, 2021, 11:10:26 pm por DarkKRuleR »

 


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


 


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