Bien, subo la
v21 gente... después de un rato largo de optimizar código logré
quitar por completo los actives que usaba de detectores, así que ahora la cantidad de Actives promedio bajó de 100 a 75, y la cantidad de eventos del nivel se redujo de una forma considerable~
Como ya no hay detectores que me identifiquen cada joya en su lugar, tuve que basar las "ubicaciones" de las joyas en las coordenadas directas y colocarlas dentro de un arreglo una única vez, para luego comprobar las líneas desde el arreglo, en vez de tener que usar los detectores para comprobar el color actual de la joya ubicada en determinada ubicación.
Como colorario, puedo agregar que
la extensión ForEach no me funcionó en android (Los eventos de for each nunca se lanzaban en la tablet, a pesar de que lo hacían perfectamente en la pc), pero como ya tenía un sistema de IDs basado en "start of frame -> spread a number on alterable value A (id)" no fué muy complicado de "traducir" a fast loop
El resultado final es un arreglo con
muchos huecos vacíos en el medio, pero esto no tiene impacto a nivel rendimiento (El arreglo mide 128x128x1)
A nivel programa, como para ilustrar un poco, se pasó de esto:
[Tienes que estar registrado y conectado para ver esa imagen]a esto:
[Tienes que estar registrado y conectado para ver esa imagen]Siendo el cuadrado negro los detectores, y el cuadrado rojo las "joyas logicas".
Y además como ahora las ubicaciones se basan en las coordenadas reales, pude aprovechar el loopindex para calcular las otras dos diagonales idénticas a las diagonales centrales, pero corridas a la derecha, sin impacto en el rendimiento pero reduciendo la cantidad de código del programa.
De 7 grupos individuales, cada uno con fastloops que se ejecutan 1 vez por movimiento, pasamos a 3 grupos individuales de los cuales 2 de ellos se ejecutan 3 veces.
[Tienes que estar registrado y conectado para ver esa imagen] ->
El rendimiento es mátemáticamente el mismo, pero la cantidad de código en el programa es menos de la mitad
En fin, a pesar de todo esto no parece haber cambios en el rendimiento del programa, aún cuando con el nuevo código se ahorran unas cuantas "pasadas" de bucles (Por el tema de que se iteran sobra todas las joyas UNA sola vez para guardarlas en el arreglo, mientras que con los detectores se comprobaban más de una vez las joyas que se usaban en varias lineas, como por ejemplo la joya central, que sirve para ambas diagonales centrales, y para la gran horizontal).
Mismo link de descarga, y la versión original con detectores se conserva en un frame aparte, accesible desde el programa
Por ahora (v21) el tablero de 5x5x5 permanece igual sin ninguna optimización, ya que con ese se pueden alcanzar los 30 fps sin mucho problema, pero luego de que haya hecho un par de optimizaciones más al tablero normal voy a re-hacer el tablero de 5x5x5 en base a ello.
No creo que copie ninguna de estas optimizaciones a la versión de PC por ahora porque la versión de PC anda a velocidad normal y sin tener que hacer ningún tipo de frameskip, y además el ejecutable de MMF2 puede manejar miles y miles de actives sin entrar en conflictos, más aún con la aceleración hardware para manejar las transformaciones y los efectos especiales y etc etc
Ya no sé bien que más hacer para optimizarlo sin tener que sacrificar rotaciones ni reducir el tamaño del tablero =="
Tendría que investigar un poco más en los fastloops que se usan para "ubicar" las joyas en el tablero,
que se ejecutan constantemente a manera de foreach para hacer todo el efecto bonito de como se mueven las joyas por el tablero (Hay dos actives de joya, la joya lógica, que es un cuadrado invisible, y la joya gráfica, que tiene un ID que lo asocia con una joya lógica y se mueve y rota con suavidad a medida que la joya lógica va cambiando de ubicación y "forma").
Ya se me había ocurrido "fusionar" la joya lógica y la de programa en un solo objeto, pero esto implicaría
reescribir todo el código del juego, o olvidarse por completo de los efectos gráficos de rotación y traslación suavizada
Y además de todo esto, está el misterio de por qué el juego se laguea por unos instantes luego de pasar el primer frame (10-15 fps), pero al cabo de unos segundos recupera la velocidad "esperable" (15-24 fps)... eso si que me tiene perplejísimo.
Ah, y recordar que los FPS objetivo son 30, no 60. 60 es algo ya inalcanzable en mi plan
En fin, ¿Alguien tiene alguna sugerencia sobre como podría optimizar más el juego para mejorar el rendimiento?