Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: DarkKRuleR en Septiembre 16, 2021, 12:00:11 am

Título: 3D Vertex_buffer dispara el uso del garbage collector aún sin utilizarse
Publicado por: DarkKRuleR en Septiembre 16, 2021, 12:00:11 am
¡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...

(https://i.gyazo.com/cc13494bf9c399b41c6348f50e256c7c.png)

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

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