Hola tengo un inconveniente bastante grave en caunto a la lentitud de mi juego dividi el primer nivel del juego, shooter rpg isometrico, en cuatro partes, 1 room por parte, los room tienen muchos objetos, efectos de particulas y muchos tiles, en la primer parte anda bien luego a medidad que voy cambiando de nivel al colisionar con un objeto y al regresar al principio de nuevo van bajando los fps y no suben mas, probe eliminando todos los tiles de todos los room, todos los efectos de particulas y hasta las instancias y sigue andando lento, al cambiar de room utilizo este codigo:
with(all){if object_index<>ROOMS { instance_destroy()}}
room_instance_clear(all)
room_tile_clear(all)
room_goto(Escenario)
}
e incluso probe poner el cambio de room dentro de una alarma como para poder verificar que primero se eliminan las instancias del room actual, antes de cambiar de room, y asi todo el problema sigue, tiene algo que ver con los eventos de cambios de room? porque tambien me di cuenta que usando room restart tambien se va alentizando en cada reinicio.
Gracias.-
Eso es porque el juego va reservando ram cada vez que crea un objeto, una variable, etc etc, lo que necesitás es la dll cleanmem, la podés encontrar en gmtoolbox.com (http://gmtoolbox.com)
Link al post (http://gmc.yoyogames.com/index.php?showtopic=438215)
Eso lo corrés cada vez que inicia o termina un room y te limpia la memoria reservada para el juego
Hola Texic, desde ya te aviso que vas a figurar en los creditos del juego con programador adicional y gran colaborador, siempre te voy a deber una. mil gracias y solo te hago una consulta mas de manera simple podrias explicarme mas o menos como recomendarias utilizar esta libreria y en que momento aplicarlo. Un abrazo.-
Para usar la dll necesitás incluirla en la carpeta del juego y cargar las funciones que vienen con el ejemplo que te descargás. Hice un tutorial, está en la sección de artículos, ahí se detalla cómo usar una dll. En el caso de esta dll, la función para limpiar memoria te recomiendo usarla al iniciar un nivel nuevo, ya que así se borrarían los datos del nivel anterior que ya no se usan. Fijate el tutorial, y si sabés inglés en el post original está explicado qué hace cada función. Si se te complica demasiado avisame y nos contactamos por msn así te ayudo personalmente a utilizarla. Saludos!
vaya esto me puede servir pero... cómo que el mismo ejemplo me da error al testearlo? :/ (sí, la dll está en la carpeta)
El error que te da al testearlo se debe a que fue creado para una versión anterior de GM, lo que tenes que hacer es corregir el codigo en el obj_cleanmen ve al event alarm y corrige este codigo asi: sprite_create_from_screen(0,0,150,150,0,0,0,1); y listo ya podras usarlo.
Yo usaba otro metodo, pero he probado este y realice comparaciones, y la diferencia fue barbara, en verdad es excelente esta dll, la usare de ahora y en adelante para juegos pesados, pronto la integrare a GEOMETRIX 3, para evitar se ralentice, de verdad recomiendo la usen.
Texic muchas gracias y gracias a todos, le comento que estuve realizando pruebas y funciona bien por ahora tengo que hacer algunos ajustes porque si bien me funciona bien en los cambios de room, en algunas partes de los niveles es como que bajan los fps nuevamente y en otras aumenta, no se bien a que se podra deber si a que en determinadas zonas ahy mas objetos o la cantidad de tiles que ahy en esas zonas pero bajan fps, e incluso me ha llegado a pasar de que de 60 fps baja a 25 fps, un monton, asi que todavia no encuentro solucion, pero lo que si puedo asegurar es que es muy recomendable la libreria.-
Pd: quizas se debe a que no la utilizo como corresponde utilizo un objecto: ObjControl, el cual se crea al inicio de cada room, en el evento create del objeto pongo:
//ALWAYS call this before cleanmem();
cleanmem_init();
y en los eventos room_start, room_end, game_start y game_end, utilizo:
//Clean excess memory before quitting.
cleanmem();
//Recommended that you call this at the end of the game
cleanmem_init(1);
quizas esta mal si alguien tiene alguna sugerencia para mejorar el rendimiento le agradesco.
Bien, ya redujiste el consumo al principio y final de las rooms, pero dentro de un mismo room para reducir el consumo deberías hacer que los objetos fueran dinámicos. He visto que en tu juego hay manchas de sangre en el piso, cierto? Si las haces con objetos lo más probable es que esa sea una de las causas, busca algún objeto que se cree constantemente y nunca se elimine (las manchas de sangre serían un ejemplo) y ahí está tu respuesta, ponele un límite de tiempo en el que permanezca creado y que luego se elimine, ya que a mayor cantidad de instancias en el juego mayor va a ser el consumo. Y en lo posible usá el instance_deactivate para desactivar instancias fuera de la pantalla. Si aún así te sigue dando lentitud hacé que la cleanmem se ejecute cuando los fps bajen 10 de lo normal (para eso al principio del room establecés como normal un promedio entre 5 o 6 medidas de fps en 10 segundos)
Gracias Texic podrias explicarme a que te refieres con mas dinamico y como harias por ejemplo para aplicarlo a la sangre (la cual si utilizo en mi juego), porque algo similar tendria que hacer con las balas que disparan y los cartuchos que caen, dado que todas son instancias que se van creando y desapareciendo en determinado tiempo pero si me disparan con una ametralladora muchos enemigos a la vez se vuelve lento, cual seria la solucion o como podria mejorarlo, y en cuanto a instance_deactivate, la utilizo desabilitando casi todo lo que esta fuera de la vista.-
Nota: se que son muchas preguntas pero ya que lo mencionantes entonces como seria recomendado uzar cleanmem al bajar entre 5 o 6 medidas de fps en 10 segundos, utilizo en mi juego en room_speed, 60fps.-
Texic: volvi a leer el post y me di cuenta que quizas no interprete bien lo que me habian explicado de los objetos dinamicos, si en el caso de la sangre (la cua son instancias de objeto que se generan al colisionar el personaje con balas u otros), lo que querias decir era que luego de un determinado tiempo se eliminen, de hecho esta funcionando asi, ahora tambien uso particulas y demas objetos como balas, cartuchos etc, pero por logica se estan eliminando pasado unos segundos, asi q no se si seria ese el problema pero escucho sugerencias, quizas ahy una manera mas rapida y eficiente. gracias.-
gracias elvis, ya vi que esa linea tenía error, pero ahora me da este error:
___________________________________________
ERROR in
action number 1
of Create Event
for object obj_cleanmem:
Illegal argument count calling script "cleanmem_init".
Script requires 1 arguments, 0 have been supplied.
Hola Sobaco en llamas mira capas que te falto en el evento create cerrar la funcion cleanmem con parentesis ya que no lleva argumentos, igual te adjunto una version corregida,si la ejecutas no tendrias que tener problemas yo la utilizo desde game maker 8.0. un abrazo.-
y bueno yo por mi parte estoy probando y probando pero no logro dar con la tecla me siguen bajando los fps y de manera bastante importante, espero encontrar la solucion.-
tampoco me funciona ese (primero me salía el eror ese del evento alarm que dijo elvis, lo corregí y de nuevo me sale esto:
sprite_create_from_screen(0,0,150,150,0,0,0,1)
;_;
Hola fijate no se porque te esta tirando el error poprque de hecho lo testee antes de enviartelo, pero verifica que la dll la tengas en la misma carpeta que el editable de game maker (ejemplo) y en el caso del error que mencionas, verifica el numero de argumentos por ahy tenes mas de los que tenes asignado, creo que deberias borrar los ultimos dos 0. un abrazo.-
Por lo que me decís esos objetos tienen límite de tiempo, les faltaría límite de cantidad, al sobrepasar cierta cantidad que se eliminen los más viejos. Para esto podés hacer una lista a medida que se vayan creando e irlos borrando cuando sobrepasen la cantidad. O sino ponerles en step que se autoeliminen al superar cierta cantidad, los que primero se crearon se ejecutarían primero y obtendrías un resultado parecido, o sino que al crearse el efecto hagas con un with que el primero se elimine
with(obj_sangre) {instance_destroy() break}
Apenas el primero sea eliminado se terminaría el recorrido del with gracias al break. Conectate a la tarde, tipo 6 que ya voy a estar libre para ayudarte, que hasta esa hora ando ocupado yendo de acá para allá xD
Saludos!
Hola Texic, queria agradecerte por tu ayuda y hacerlo publico, gracias a la ayuda de Texic via msn pude solucionar el problema de lentitud que estaba teniendoen mi juego ahora corre a 60 fps por ahy baja algun que otro cuadro pero vuelve a 60fps y lo soluciones en primera instancias reemplazando particulas por sprites, utilizando la dll cleanmem y por ultimo en algunos objetos que requieren particulas en el evento detroy, destruyendo todo sistema, emisor y tipos de particulas. gracias a todos.
kurt: +1 karma.-